Это вопрос подсказки для игры в гольф на 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))}