Python'daki bir listenin en yaygın öğeleri


13

Bu ana konuyla ilgili Python golf için bir ipucu sorudur.

Python'daki bir listenin en yaygın unsurlarını mümkün olan en kısa şekilde elde etmenin en kısa yolunu arıyorum. İşte denedim, listenin adında bir değişken olduğunu varsayarsak l:

from statistics import*
mode(l)

Birden fazla mod varsa bu bir hata atar.

max(l,key=l.count)

Bu sadece 1 öğe döndürür , en büyük sayımın tüm öğelerini almam gerekiyor .

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

Bu (element, count), sayılarına göre sıralanmış bir tuples listesi döndürür . Bundan, karşılık gelen sayısı ilkine eşit olan tüm öğeleri çekebilirim, ancak bundan daha iyi bir golf yolu göremiyorum:

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

Eminim daha kısa bir yol var!

Ayrıca, değişken ataması veya çoklu kullanımları olmadan yapılabilirse l, daha fazla bayt kaydetmek için kodun geri kalanını lambda ifadesi olarak tutabilirim.

Düzenleme: Per @ Uriel'in önerisine göre şunları yapabiliriz:

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

Ve list.countbirkaç bayt için takma ad yapabilirim :

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

@ Uriel, birkaç bayt daha alabileceğimize dikkat çekti map:

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

İlgili , ama ihtiyacım olanı yapmaz
musicman523

Yanıtlar:


5

Buna ne dersin?

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

[*...]Bir liste almak için içine alın .


Oh, benzersiz bir listeye veya sete ihtiyacım var, teşekkürler
musicman523

@ musicman523 ile neden güncellediniz l.count(max(l,key=l.count))? max(map(l.count,l))daha kısa
Uriel

Ahhhh Bunu düşünmedim, teşekkürler!
musicman523
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.