Це питання порад щодо гольфу в 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
, я можу зберегти решту коду як лямбда-вираз, щоб зберегти більше байтів.
Редагувати: За пропозицією @ Uriel ми можемо:
{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))}