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.count
fü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))}
Antworten:
Wie wäre es mit diesem?
Fügen Sie hinzu
[*...]
, um eine Liste zu erhalten.quelle
l.count(max(l,key=l.count))
?max(map(l.count,l))
ist kürzer