Elementos mais comuns de uma lista em Python

13

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.countpor 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))}
musicman523
fonte
Relacionados , mas não faz o que eu preciso
musicman523

Respostas:

5

Que tal este?

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

Anexe [*...]para obter uma lista.

Uriel
fonte
Oh certo, eu preciso de uma lista única ou conjunto, graças
musicman523
@ musicman523 Por que você atualizou l.count(max(l,key=l.count))? max(map(l.count,l))é menor
Uriel
Ahhhh eu não pensei nisso, obrigado!
musicman523