Esta é uma questão de dicas para jogar golfe no Python, que está no tópico principal.
Estou procurando a maneira mais curta de obter todos os elementos mais comuns de uma lista em Python, da maneira mais curta possível. Aqui está o que eu tentei, supondo que a lista esteja em uma variável chamada l
:
from statistics import*
mode(l)
Isso gera um erro se houver vários modos.
max(l,key=l.count)
Isso retorna apenas 1 item, preciso obter todos os elementos de maior contagem.
from collections import*
Counter(l).most_common()
Isso retorna uma lista de tuplas (element, count)
, classificadas por contagem. Com isso, eu poderia extrair todos os elementos cuja contagem correspondente é igual à primeira, mas não vejo uma maneira de jogar isso muito melhor do que:
from collections import*
c=Counter(l).most_common()
[s for s,i in c if i==c[0][1]]
Tenho certeza de que há um caminho mais curto!
Além disso, se isso puder ser feito sem atribuição de variável ou vários usos de l
, posso manter o restante do código como uma expressão lambda para salvar mais bytes.
Edit: Por sugestão de @ Uriel, podemos fazer:
{s for s in l if l.count(s)==l.count(max(l,key=l.count))}
E eu posso alias list.count
por alguns bytes:
c=l.count;{s for s in l if c(s)==c(max(l,key=c))}
@Uriel apontou que podemos obter mais alguns bytes com map
:
c=l.count;{s for s in l if c(s)==max(map(c,l))}
Respostas:
Que tal este?
Anexe
[*...]
para obter uma lista.fonte
l.count(max(l,key=l.count))
?max(map(l.count,l))
é menor