Wie kann ich herausfinden welche Zahl in meiner Liste am meisten vorkommt [Python]?
Ich habe eine Liste mit sehr vielen 7-Stelligen Zahlen, und möchte nun herausfinden welche Zahl am häufigsten in meiner Liste ist.
z.B
a = [[1234567], [7654321], [1234567], [7654321], [1234567]]
Nun möchte ich irgendwie heraufinden, dass [1234567] am meisten in meiner Liste vorhanden ist.
In der richtigen Liste sind es natürlich sehr viele x-Beliebige Zahlen
4 Antworten
Nutze collections.Counter. Dann einfach schauen, welcher Schlüssel den höchsten Wert hat, fertig.
Exemplarisch:
>>> l=[1,2,5,1,5,2,9,11,23,7,1,8,2]
>>> max(collections.Counter(l).items(),key=lambda v:v[1])[0]
1
Noch als Ergänzung, Counter ist letztlich nur ein spezialisiertes Dictionary, dessen Kontruktor Dir die Arbeit der Histogrammbildung direkt abnimmt - die Nutzung ist reine Bequemlichkeit. Die Liste wird also einmal linear gescannt, danach scannt max über alle Einträge und sucht das Maximum. Warum ich diese Variante vorgeschlagen habe, 2 lineare Scans bedeutet O(n).
Die Methode count der Liste muß für einen gegebenen Wert die Liste linear abscannen, insbesondere muß sie das für jedes Element der Liste machen, das bedeutet O(n^2). Die Nutzung von Sets kann helfen, wenn ich wenig einzigartige Werte habe, andernfalls wirds damit nicht viel besser.
Ich demonstriere das mal in Zahlen, damit es eindrücklicher ist:
timeit.timeit('max(collections.Counter(l).items(),key=lambda v:v[1])[0]',setup="from __main__ import l,collections",number=1)
0.004965975880622864
timeit.timeit('max(l,key=l.count)',setup="from __main__ import l",number=1)
17.095573596656322
Der Unterschied ist bei größeren Listen also eklatant.
Das nennt man in der Statistik den Modalwert (nicht zu verwechseln mit dem Modalwert aus der Mathematik). Gibt's im eingebauten Statistikmodul von Python.
from statistics import mode
a = [1234567, 7654321, 1234567, 7654321, 1234567]
print(mode(a))
Du musst die Werte in a natürlich als Zahlen einfügen und nicht wie in deinem Beispiel als Listen mit jeweils einer Zahl.
Am besten natürlich, indem du die Liste gleich so anlegst. Ansonsten z.B. mit
b = [y for x in a for y in x]
Zwei Ansätze:
- Erstelle ein Dict und iteriere über deine Liste mit einer Schleife. Wenn ein Wert nicht im Dict ist, füge ihn hinzu und setz den Wert auf 1; sonst inkrementiere Wert. Anschließend schaust du in dem Dict nach dem Maximum
- Erstelle ein Set aus der Liste, um die einzelnen eindeutigen Werte zu bekommen. Iteriere über diese Werte und lass z.B. über list.count(value) die Anzahl der Werte bestimmen. Das Maximum dort merkst du dir und aktualisierst es, wenn nötig
a = [[1234567], [7654321], [1234567], [7654321], [1234567]]
max(a, key=a.count)
# [1234567]
Wie kann ich ich [[1],[2],[3]] zu [1,2,3] umwandeln?