Elementi più comuni di un elenco in Python


13

Questa è una domanda di consigli per giocare a golf in Python, che è in tema principale.

Sto cercando il modo più breve per ottenere tutti gli elementi più comuni di un elenco in Python, nel modo più breve possibile. Ecco cosa ho provato, supponendo che l'elenco si trovi in ​​una variabile chiamata l:

from statistics import*
mode(l)

Questo genera un errore se ci sono più modalità.

max(l,key=l.count)

Questo restituisce solo 1 oggetto, ho bisogno di ottenere tutti gli elementi di maggior valore.

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

Questo restituisce un elenco di tuple di (element, count), ordinate per conteggio. Da questo ho potuto estrarre tutti gli elementi il ​​cui conteggio corrispondente è uguale al primo, ma non vedo un modo di giocare a golf molto meglio di:

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

Sono sicuro che c'è un modo più breve!

Inoltre, se può essere fatto senza assegnazione di variabili o usi multipli di l, posso mantenere il resto del codice come espressione lambda per salvare più byte.

Modifica: per il suggerimento di @Uriel, possiamo fare:

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

E posso alias list.countper pochi byte:

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

@Uriel ha sottolineato che possiamo ottenere un paio di byte in più con map:

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

Relativo , ma non fa quello di cui ho bisogno
musicman523

Risposte:


5

Che ne dici di questo?

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

Racchiudere [*...]per ottenere un elenco.


Oh giusto, ho bisogno di un elenco o di un set unico, grazie
musicman523,

@ musicman523 perché hai effettuato l'aggiornamento l.count(max(l,key=l.count))? max(map(l.count,l))è più corto
Uriel, il

Ahhhh non ci avevo pensato, grazie!
musicman523,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.