2013-11-08 6 views
-3

Привет Я новичок в программировании и хочу изучить python. Я работаю над кодом, который должен возвращать элементы, которые являются наиболее избыточными в списке. Если их больше 1, то он должен вернуть все. Пример.Все общие элементы, присутствующие в списке Python

List = ['a','b','c','b','d','a'] #then it should return both a and b. 
List = ['a','a','b','b','c','c','d'] #then it should return a b and c. 
List = ['a','a','a','b','b','b','c','c','d','d','d'] #then it should return a b and d. 

Примечание: Мы не знаем, какой элемент является наиболее распространенным в списке, таким образом, мы должны найти наиболее общий элемент, и если есть больше чем один он должен вернуть все. Если в списке есть номера или другие строки в качестве элементов, то также код должен работать

Я понятия не имею, как действовать. Я могу немного помочь.

Вот вся программа:

from collections import Counter 

def redundant(List): 
    c = Counter(List) 
    maximum = c.most_common()[0][1] 
    return [k for k, v in c.items()if v == maximum] 

def find_kmers(DNA_STRING, k): 
    length = len(DNA_STRING) 
    a = 0 
    List_1 = [] 
    string_1 = "" 
    while a <= length - k: 
     string_1 = DNA_STRING[a:a+k] 
     List_1.append(string_1) 
     a = a + 1 
    redundant(List_1) 

Эта программа должна принимать строку ДНК и длину kmer и найти то, что являются Кемерс той длины, которые присутствуют в этой строке ДНК.

Пример ввод:

ACGTTGCATGTCGCATGATGCATGAGAGCT 
4 

Пример вывод:

CATG GCAT 
+0

Ты ничего от 'find_kmers' функции не возвращаются, используйте:' (List_1) ' –

+0

да, спасибо, он сделал трюк – user2954438

+0

Просто для информации, если мне нужно ввести очень длинную строку в DNA_strin g как я могу это сделать? Строки ДНК очень большие, самые маленькие были бы около миллиона символов. Я использую канал или есть другие способы работы с длинной символьной строкой. – user2954438

ответ

2

Вы можете использовать collections.Counter:

from collections import Counter 
def solve(lis): 
    c = Counter(lis) 
    mx = c.most_common()[0][1] 
    #or mx = max(c.values()) 
    return [k for k, v in c.items() if v == mx] 

print (solve(['a','b','c','b','d','a'])) 
print (solve(['a','a','b','b','c','c','d'])) 
print (solve(['a','a','a','b','b','b','c','c','d','d','d'])) 

Выход:

['a', 'b'] 
['a', 'c', 'b'] 
['a', 'b', 'd'] 
!

несколько иная версия приведенного выше кода с использованием itertools.takewhile:

from collections import Counter 
from itertools import takewhile 
def solve(lis): 
    c = Counter(lis) 
    mx = max(c.values()) 
    return [k for k, v in takewhile(lambda x: x[1]==mx, c.most_common())] 
+0

@thefourtheye Мой плохой, исправил его.:) –

+0

@thefourtheye На самом деле вы были частично правы, я должен был использовать 'iteritems' в LC. –

+1

Это выглядит хорошо. Извините, мне пришлось -1, чтобы привлечь ваше внимание. Я возвращаю его обратно. – thefourtheye

0

Просто ради придания решения не использовать collections & используя списковые.

given_list = ['a','b','c','b','d','a'] 
redundant = [(each, given_list.count(each)) for each in set(given_list) if given_list.count(each) > 1] 
count_max = max(redundant, key=lambda x: x[1])[1] 
final_list = [char for char, count in redundant if count == count_max] 

PS - Я сам не использовал Counters еще :(Время, чтобы узнать

+2

Это тоже неправильно. Он делает ** НЕ ** хочет подсчитать количество элементов, которые происходят более одного раза. Пожалуйста, снова прочитайте вопрос. – thefourtheye

+0

Исправлен код. Спасибо за указание. –

0
>>> def maxs(L): 
... counts = collections.Counter(L) 
... maxCount = max(counts.values()) 
... return [k for k,v in counts.items() if v==maxCount] 
... 
>>> maxs(L) 
['a', 'b'] 
>>> L = ['a','a','b','b','c','c','d'] 
>>> maxs(L) 
['a', 'b', 'c'] 
>>> L = ['a','a','a','b','b','b','c','c','d','d','d'] 
>>> maxs(L) 
['d', 'a', 'b'] 
+0

Это тоже неправильно. Он делает ** НЕ ** хочет подсчитать количество элементов, которые происходят более одного раза. Пожалуйста, снова прочитайте вопрос. – thefourtheye

+0

@thefourtheye: Спасибо за сообщение об ошибке. Обновлено – inspectorG4dget

1
inputData = [['a','b','c','b','d','a'], ['a','a','b','b','c','c','d'], ['a','a','a','b','b','b','c','c','d','d','d'] ] 
from collections import Counter 
for myList in inputData: 
    temp, result = -1, [] 
    for char, count in Counter(myList).most_common(): 
     if temp == -1: temp = count 
     if temp == count: result.append(char) 
     else: break 
    print result 

Выход

['a', 'b'] 
['a', 'c', 'b'] 
['a', 'b', 'd'] 
Смежные вопросы