Найпоширеніші елементи списку в 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, я можу зберегти решту коду як лямбда-вираз, щоб зберегти більше байтів.

Редагувати: За пропозицією @ 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))}

Пов’язано , але не робить те, що мені потрібно
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.