Lebih
Bagaimana saya bisa menghitung kemunculan sebuah daftar item?
Diberikan sebuah item, bagaimana saya bisa menghitung kejadian dalam daftar di Python?
1404
22
Jika anda hanya ingin satu item's menghitung, gunakan
menghitung
metode:Don't gunakan ini jika anda ingin menghitung beberapa item. Panggilan
hitung
dalam lingkaran membutuhkan terpisah melewati daftar untuk setiapmenghitung
call, yang dapat menjadi bencana bagi kinerja. Jika anda ingin menghitung semua item, atau bahkan hanya beberapa item, gunakanCounter
, sebagaimana dijelaskan dalam jawaban yang lain.Jika anda menggunakan Python 2.7 atau 3 dan anda ingin jumlah kejadian untuk masing-masing elemen:
Menghitung kejadian dari satu item dalam daftar
Untuk menghitung kejadian dari salah satu daftar item anda dapat menggunakan
count()
Menghitung kejadian dari semua item dalam daftar ini juga dikenal sebagai "menghitung-hitung", daftar, atau membuat tally counter.
Menghitung semua item dengan count()
Untuk menghitung kemunculan item dalam
l
satu hanya dapat menggunakan daftar pemahaman dancount()
metode(atau sama dengan kamus
dict((x,l.count(x)) for x in set(l))
)Contoh:
Menghitung semua item dengan Counter()
Selain itu, ada's lebih cepat
Counter
kelas darikoleksi
perpustakaanContoh:
Seberapa cepat adalah Counter?
Aku memeriksa seberapa cepat
Counter
untuk menghitung-hitung daftar. Aku mencoba kedua metode dengan beberapa nilai-nilain
dan tampaknya bahwaCounter
lebih cepat dengan faktor konstan kira-kira 2.Berikut adalah script yang saya gunakan:
Dan output:
Cara lain untuk mendapatkan jumlah kejadian dari masing-masing item, dalam kamus:
daftar.count(x)
mengembalikan jumlah kalix
muncul di daftarlihat: http://docs.python.org/tutorial/datastructures.html#more-on-lists
Berikut ini's contoh daftar:
daftar.count
Ada's
daftar.menghitung
metodeIni bekerja dengan baik untuk setiap daftar. Tuple memiliki metode ini juga:
koleksi.Counter
Dan kemudian ada's koleksi.Counter. Anda dapat membuang iterable ke Counter, tidak hanya daftar, dan Counter akan mempertahankan struktur data penting dari unsur-unsur.
Penggunaan:
Counter yang berbasis pada Python kamus, kunci mereka adalah unsur-unsur, sehingga kunci-kunci harus hashable. Mereka pada dasarnya seperti set yang memungkinkan berlebihan elemen ke mereka.
Penggunaan lebih lanjut dari
koleksi.Counter
Anda dapat menambah atau mengurangi dengan iterables dari counter anda:
Dan anda dapat melakukan multi-operasi set dengan meja serta:
Mengapa tidak panda?
Jawaban lain menunjukkan:
Panda adalah perpustakaan umum, tapi itu's tidak di perpustakaan standar. Menambahkan itu sebagai persyaratan adalah non-sepele.
Ada builtin solusi untuk ini use case dalam daftar objek itu sendiri serta di perpustakaan standar.
Jika proyek anda sudah tidak memerlukan panda, itu akan menjadi bodoh untuk membuat sebuah kebutuhan, hanya untuk fungsi ini.
Jika anda ingin menghitung semua nilai-nilai sekaligus anda dapat melakukannya dengan sangat cepat menggunakan numpy array dan
bincount
sebagai berikutyang memberikan
I've dibandingkan semua solusi yang disarankan (dan beberapa yang baru) dengan perfplot (proyek kecil saya).
Menghitung one item
Untuk yang cukup besar array, ternyata
sedikit lebih cepat daripada solusi lain.
Menghitung all item
Sebagaimana ditetapkan sebelum,
adalah apa yang anda inginkan.
Kode untuk memunculkan plot:
Jika anda dapat menggunakan
panda
, kemudianvalue_counts
ada untuk menyelamatkan.Secara otomatis macam hasil berdasarkan frekuensi juga.
Jika anda ingin hasil yang akan di daftar dari daftar, lakukan seperti di bawah ini
Mengapa tidak menggunakan Panda?
Output:
Jika anda mencari untuk menghitung elemen tertentu, katakanlah a, cobalah:
Output:
Aku punya masalah ini hari ini dan digulung saya sendiri solusi sebelum aku berpikir untuk check-JADI. Ini:
ini benar-benar, benar-benar lambat untuk daftar besar. Solusi saya
sebenarnya sedikit lebih cepat dari Counter solusi, setidaknya untuk Python 2.7.
Menghitung semua elemen dengan
itertools.groupby()
Batu possiblity untuk mendapatkan hitungan dari semua unsur-unsur dalam daftar bisa dengan cara
itertools.groupby()
.Dengan "duplikat" jumlah
Kembali
Perhatikan bagaimana itu gabungan tiga pertama
a
's seperti kelompok pertama, sedangkan kelompok laina
yang hadir lebih jauh ke bawah daftar. Hal ini terjadi karena input daftarL
tidak diurutkan. Ini bisa menjadi manfaat yang kadang-kadang jika kelompok-kelompok yang seharusnya terpisah.Dengan jumlah
Jika kelompok yang unik jumlah yang diinginkan, hanya mengurutkan daftar masukan:
Kembali
Catatan: Untuk menciptakan yang unik, penting, banyak jawaban yang lain memberikan kemudahan dan kode lebih mudah dibaca dibandingkan dengan
groupby
solusi. Tapi yang ditampilkan di sini untuk menarik paralel untuk duplikat menghitung contoh.Berikut ini adalah tiga solusi:
Tercepat adalah dengan menggunakan loop for dan menyimpannya dalam sebuah Dict.
Hasil
Untuk menghitung jumlah elemen yang beragam memiliki jenis umum:
memberikan
3
, bukan 6Ia menyarankan untuk menggunakan numpy's bincount, namun ia bekerja hanya untuk 1d array dengan non-negatif bilangan bulat. Juga, array yang dihasilkan mungkin akan membingungkan (mengandung kemunculan bilangan bulat dari min max asli daftar, dan set ke 0 yang hilang bilangan bulat).
Cara yang lebih baik untuk melakukannya dengan numpy adalah dengan menggunakan unik fungsi dengan atribut
return_counts
set ke True. Kembali sebuah tuple dengan sebuah array dari nilai-nilai unik dan sebuah array dari kemunculan setiap nilai yang unik.dan kemudian kita dapat memasangkan mereka sebagai
Ia juga bekerja dengan tipe data lain dan "2d daftar", misalnya
Anda juga dapat menggunakan
countOf
metode built-in moduloperator
.Meskipun ini adalah pertanyaan kuno, tapi seperti yang saya didn't menemukan salah satu kapal, saya membuat satu.
Mungkin bukan yang paling efisien, membutuhkan tambahan lulus untuk menghapus duplikat.
Pelaksanaan jabatan fungsional :
kembali :
atau kembali sebagai
dict
:kembali :
Ini akan mengembalikan jumlah kejadian dari your_value