Наиболее распространенные элементы списка в Python


13

Это вопрос подсказки для игры в гольф на Python, который находится на главной теме.

Я ищу кратчайший способ получить все наиболее распространенные элементы списка в Python, кратчайшим возможным способом. Вот что я пробовал, предполагая, что список находится в переменной с именем l:

from statistics import*
mode(l)

Это выдает ошибку, если есть несколько режимов.

max(l,key=l.count)

Это возвращает только 1 элемент, мне нужно получить все элементы наибольшего количества.

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

Это возвращает список кортежей (element, count), отсортированных по количеству. Из этого я мог бы извлечь все элементы, чье число соответствует первому, но я не вижу способа сыграть в гольф намного лучше, чем:

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

Я уверен, что есть более короткий путь!

Кроме того, если это можно сделать без назначения переменных или многократного использования l, я могу сохранить оставшуюся часть кода в виде лямбда-выражения, чтобы сохранить больше байтов.

Изменить: По предложению @ Уриэля, мы можем сделать:

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

И я могу псевдоним list.countдля нескольких байтов:

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

@Uriel указал, что мы можем получить еще пару байтов с map:

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

Связано , но не делает то, что мне нужно
musicman523

Ответы:


5

Как насчет этого?

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

Вложите, [*...]чтобы получить список.


Ах да, мне нужен уникальный список или набор, спасибо
musicman523

@ musicman523 почему вы обновились l.count(max(l,key=l.count))? max(map(l.count,l))Короче
Уриэль

Ааааа, я не думал об этом, спасибо!
musicman523
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.