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.count
por 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))}
Respuestas:
¿Que tal este?
Acércate
[*...]
para obtener una lista.fuente
l.count(max(l,key=l.count))
?max(map(l.count,l))
es más corto