Häufigste Elemente einer Liste in Python

13

Dies ist eine Tippfrage zum Golfen in Python, die zum Thema Main gehört.

Ich suche nach dem kürzesten Weg, um alle gängigen Elemente einer Liste in Python auf kürzestem Weg zu erhalten. Ich habe Folgendes versucht, vorausgesetzt, die Liste befindet sich in einer Variablen mit dem Namen l:

from statistics import*
mode(l)

Dies löst einen Fehler aus, wenn mehrere Modi vorhanden sind.

max(l,key=l.count)

Dies gibt nur 1 Element zurück, ich muss alle Elemente mit der größten Anzahl erhalten.

from collections import*
Counter(l).most_common()

Dies gibt eine Liste von Tupeln zurück (element, count), sortiert nach Anzahl. Daraus könnte ich alle Elemente ziehen, deren entsprechende Anzahl gleich der ersten ist, aber ich sehe keinen Weg, um so viel besser Golf zu spielen als:

from collections import*
c=Counter(l).most_common()
[s for s,i in c if i==c[0][1]]

Ich bin sicher, dass es einen kürzeren Weg gibt!

Wenn es auch ohne variable Zuweisung oder Mehrfachverwendung von möglich ist l, kann ich den Rest des Codes als Lambda-Ausdruck beibehalten, um mehr Bytes zu sparen.

Edit: Per @ Uriels Vorschlag können wir tun:

{s for s in l if l.count(s)==l.count(max(l,key=l.count))}

Und ich kann Alias list.countfür ein paar Bytes:

c=l.count;{s for s in l if c(s)==c(max(l,key=c))}

@Uriel wies darauf hin, dass wir mit ein paar Bytes mehr bekommen können map:

c=l.count;{s for s in l if c(s)==max(map(c,l))}
musicman523
quelle
Verwandte , aber nicht das, was ich brauche
musicman523

Antworten:

5

Wie wäre es mit diesem?

c=l.count;{x for x in l if c(x)==max(map(c,l))}

Fügen Sie hinzu [*...], um eine Liste zu erhalten.

Uriel
quelle
Oh richtig, ich brauche eine eindeutige Liste oder ein Set, danke
musicman523
@ musicman523 warum hast du mit updaten l.count(max(l,key=l.count))? max(map(l.count,l))ist kürzer
Uriel
Ahhhh, daran habe ich nicht gedacht, danke!
Musicman523