Éléments les plus courants d'une liste en Python

13

Ceci est une question de conseils pour le golf en Python, qui est sur le thème principal.

Je cherche le moyen le plus court pour obtenir tous les éléments les plus courants d'une liste en Python, de la manière la plus courte possible. Voici ce que j'ai essayé, en supposant que la liste se trouve dans une variable appelée l:

from statistics import*
mode(l)

Cela génère une erreur s'il existe plusieurs modes.

max(l,key=l.count)

Cela ne renvoie que 1 article, j'ai besoin d'obtenir tous les éléments du plus grand nombre.

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

Cela renvoie une liste de tuples de (element, count), triés par nombre. De cela, je pourrais tirer tous les éléments dont le nombre correspondant est égal au premier, mais je ne vois pas un moyen de jouer au golf beaucoup mieux que:

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

Je suis sûr qu'il y a un chemin plus court!

De plus, si cela peut être fait sans affectation de variable ou utilisations multiples de l, je peux conserver le reste du code comme une expression lambda pour économiser plus d'octets.

Edit: Selon la suggestion de @ Uriel, nous pouvons faire:

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

Et je peux alias list.countpour quelques octets:

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

@Uriel a souligné que nous pouvons obtenir quelques octets supplémentaires avec map:

c=l.count;{s for s in l if c(s)==max(map(c,l))}
musicman523
la source
Connexes , mais ne fait pas ce dont j'ai besoin
musicman523

Réponses:

5

Celui-ci, ça va?

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

Joignez-vous à [*...]pour obtenir une liste.

Uriel
la source
Oh
oui
@ musicman523 pourquoi avez-vous mis à jour avec l.count(max(l,key=l.count))? max(map(l.count,l))est plus court
Uriel
Ahhhh je n'y ai pas pensé, merci!
musicman523