Elementos más comunes de una lista en Python

13

Esta es una pregunta de consejos para jugar golf en Python, que es el tema principal.

Estoy buscando la forma más corta de obtener todos los elementos más comunes de una lista en Python, de la manera más corta posible. Esto es lo que he intentado, suponiendo que la lista esté en una variable llamada l:

from statistics import*
mode(l)

Esto arroja un error si hay múltiples modos.

max(l,key=l.count)

Esto solo devuelve 1 elemento, necesito obtener todos los elementos de mayor recuento.

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

Esto devuelve una lista de tuplas de (element, count), ordenadas por conteo. De esto, podría extraer todos los elementos cuyo conteo correspondiente es igual al primero, pero no veo una forma de golf mejor que:

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

Estoy seguro de que hay un camino más corto!

Además, si se puede hacer sin asignación de variables o usos múltiples de l, puedo mantener el resto del código como una expresión lambda para guardar más bytes.

Editar: Según la sugerencia de @ Uriel, podemos hacer:

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

Y puedo alias list.countpor unos pocos bytes:

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

@Uriel señaló que podemos obtener un par de bytes más con map:

c=l.count;{s for s in l if c(s)==max(map(c,l))}
musicman523
fuente
Relacionado , pero no hace lo que necesito
musicman523

Respuestas:

5

¿Que tal este?

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

Acércate [*...]para obtener una lista.

Uriel
fuente
Ah, sí, necesito una lista o conjunto único, gracias
Musicman523
@ musicman523 ¿por qué actualizaste l.count(max(l,key=l.count))? max(map(l.count,l))es más corto
Uriel
Ahhhh no pensé en eso, ¡gracias!
musicman523