Frage

Hallo, ich bin neu im Programmieren und möchte Python lernen. Ich arbeite an einem Code, der Elemente zurückgeben sollte, die in einer Liste am redundant sind. Wenn es mehr als 1 gibt, sollte es alle zurückgeben. Ex.

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.

Hinweis: Wir wissen nicht, welches Element in der Liste am häufigsten vorkommt, daher müssen wir das häufigste Element finden und wenn es mehr als eine gibt, sollte es alles zurückgeben. Wenn die Liste Nummern oder andere Zeichenfolgen als Elemente enthält, muss auch der Code funktionieren

Ich habe keine Ahnung, wie ich vorgehen soll. Ich kann ein wenig Hilfe verwenden.

Hier ist das gesamte Programm:

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)

Dieses Programm sollte die DNA -Schnur und die Länge von KMER aufnehmen und finden, was die Kemer dieser Länge sind, die in dieser DNA -Schnur vorhanden sind.

Probeneingang:

ACGTTGCATGTCGCATGATGCATGAGAGCT
4

Beispielausgabe:

CATG GCAT  
War es hilfreich?

Lösung

Sie können verwenden 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'] ))

Ausgabe:

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

Eine etwas andere Version des obigen Code 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())]

Andere Tipps

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

Ausgabe

['a', 'b']
['a', 'c', 'b']
['a', 'b', 'd']
>>> 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']

Nur um eine Lösung zu geben, die nicht verwendet wird collections & Verwenden von Listenfindungen.

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 - Ich selbst habe nicht benutzt Counters Noch :( Zeit zum Lernen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top