Elemen paling umum dari daftar di Python

13

Ini adalah pertanyaan kiat untuk bermain golf di Python, yang merupakan topik utama.

Saya mencari cara terpendek untuk mendapatkan semua elemen paling umum dari daftar di Python, dengan cara sesingkat mungkin. Inilah yang saya coba, dengan asumsi daftar dalam variabel yang disebut l:

from statistics import*
mode(l)

Ini menimbulkan kesalahan jika ada beberapa mode.

max(l,key=l.count)

Ini hanya mengembalikan 1 item, saya harus mendapatkan semua elemen dengan jumlah terbesar.

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

Ini mengembalikan daftar tupel (element, count), diurutkan berdasarkan hitungan. Dari sini saya bisa menarik semua elemen yang hitungannya sama dengan yang pertama, tapi saya tidak melihat cara bermain golf ini jauh lebih baik daripada:

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

Saya yakin ada cara yang lebih singkat!

Juga, jika itu dapat dilakukan tanpa penugasan variabel atau beberapa penggunaan l, saya dapat menyimpan sisa kode sebagai ekspresi lambda untuk menyimpan lebih banyak byte.

Sunting: Per saran Uriel, kita dapat melakukan:

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

Dan saya dapat alias list.countuntuk beberapa byte:

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

@Uriel menunjukkan bahwa kita bisa mendapatkan beberapa byte lagi dengan map:

c=l.count;{s for s in l if c(s)==max(map(c,l))}
musicman523
sumber
Terkait , tetapi tidak melakukan apa yang saya butuhkan
musicman523

Jawaban:

5

Bagaimana dengan yang ini?

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

Lekatkan [*...]untuk mendapatkan daftar.

Uriel
sumber
Oh benar, saya perlu daftar atau set yang unik, terima kasih
musicman523
@ musicman523 mengapa Anda memperbarui l.count(max(l,key=l.count))? max(map(l.count,l))lebih pendek
Uriel
Ahhhh aku tidak memikirkan yang itu, terima kasih!
musicman523