Diberikan item, bagaimana saya bisa menghitung kemunculannya dalam daftar dengan Python?
1530
Jika Anda hanya menginginkan hitungan satu item, gunakan count
metode ini:
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
Jangan gunakan ini jika Anda ingin menghitung banyak item. Memanggil count
dalam satu lingkaran memerlukan pass terpisah dari daftar untuk setiap count
panggilan, yang dapat menjadi bencana bagi kinerja. Jika Anda ingin menghitung semua item, atau bahkan hanya beberapa item, gunakan Counter
, seperti yang dijelaskan dalam jawaban lainnya.
mylist = [1,7,7,7,3,9,9,9,7,9,10,0] print sorted(set([i for i in mylist if mylist.count(i)>2]))
Gunakan
Counter
jika Anda menggunakan Python 2.7 atau 3.x dan Anda ingin jumlah kemunculan untuk setiap elemen:sumber
isinstance
. Jadi jika Anda yakin tentang data yang sedang Anda kerjakan, mungkin lebih baik untuk menulis fungsi kustom tanpa jenis dan contoh memeriksa.isinstance
Panggilan apa ? Bahkan dengan jutaan string, panggilanCounter
hanya melibatkan satuisinstance
panggilan, untuk memeriksa apakah argumennya adalah pemetaan. Anda kemungkinan besar salah menilai apa yang memakan waktu Anda.Counter
telah dimasukkan ke menghitung iterables besar, daripada menghitung iterables banyak. Menghitung sejuta-string iterable akan berjalan lebih cepat denganCounter
daripada dengan implementasi manual. Jika Anda ingin meneleponupdate
dengan banyak iterables, Anda mungkin dapat mempercepat dengan menggabungkannya menjadi satu iterable denganitertools.chain
.Menghitung kemunculan satu item dalam daftar
Untuk menghitung kemunculan hanya satu item daftar yang dapat Anda gunakan
count()
Menghitung kemunculan semua item dalam daftar juga dikenal sebagai "penghitungan" daftar, atau membuat penghitungan penghitungan.
Menghitung semua item dengan count ()
Untuk menghitung kemunculan item dalam
l
satu cukup menggunakan daftar pemahaman dancount()
metode(atau mirip dengan kamus
dict((x,l.count(x)) for x in set(l))
)Contoh:
Menghitung semua item dengan Penghitung ()
Atau, ada
Counter
kelas yang lebih cepat daricollections
perpustakaanContoh:
Seberapa cepat Counter?
Saya memeriksa seberapa cepat
Counter
daftar penghitungan. Saya mencoba kedua metode dengan beberapa nilain
dan tampaknyaCounter
lebih cepat dengan faktor konstan sekitar 2.Berikut ini skrip yang saya gunakan:
Dan hasilnya:
sumber
Counter
adalah cara yang lebih cepat untuk daftar yang lebih besar. Metode pemahaman daftar adalah O (n ^ 2),Counter
harus O (n).isinstance
. Jadi jika Anda yakin tentang data yang sedang Anda kerjakan, mungkin lebih baik untuk menulis fungsi kustom tanpa jenis dan contoh memeriksa.Cara lain untuk mendapatkan jumlah kemunculan setiap item, dalam kamus:
sumber
n * (number of different items)
operasi, tidak menghitung waktu yang diperlukan untuk membangun set. Penggunaannyacollections.Counter
jauh lebih baik.i
, karena akan mencoba memasukkan beberapa kunci dengan nilai yang sama dalam kamus.dict((i, a.count(i)) for i in a)
list.count(x)
mengembalikan berapa kalix
muncul dalam daftarlihat: http://docs.python.org/tutorial/datastructures.html#more-on-lists
sumber
Berikut daftar contohnya:
list.count
Itu
list.count
metodenyaIni berfungsi dengan baik untuk daftar apa pun. Tuples juga memiliki metode ini:
collections.Counter
Dan kemudian ada koleksi. Penghitung. Anda bisa membuang semua iterable ke Counter, bukan hanya daftar, dan Counter akan mempertahankan struktur data dari jumlah elemen.
Pemakaian:
Penghitung didasarkan pada kamus Python, kuncinya adalah elemen, sehingga kuncinya harus dapat di hashable. Mereka pada dasarnya seperti set yang memungkinkan elemen berlebihan ke dalamnya.
Penggunaan lebih lanjut dari
collections.Counter
Anda dapat menambah atau mengurangi dengan iterables dari counter Anda:
Dan Anda dapat melakukan operasi multi-set dengan penghitung juga:
Kenapa tidak panda?
Jawaban lain menunjukkan:
Panda adalah perpustakaan umum, tetapi tidak ada di perpustakaan standar. Menambahkannya sebagai persyaratan adalah tidak sepele.
Ada solusi bawaan untuk kasus penggunaan ini di objek daftar itu sendiri maupun di perpustakaan standar.
Jika proyek Anda belum membutuhkan panda, bodoh jika menjadikannya persyaratan hanya untuk fungsi ini.
sumber
Saya telah membandingkan semua solusi yang disarankan (dan beberapa yang baru) dengan perfplot (proyek kecil saya).
Menghitung satu item
Untuk array yang cukup besar, ternyata itu
sedikit lebih cepat daripada solusi lainnya.
Menghitung semua item
Seperti yang ditetapkan sebelumnya ,
adalah apa yang kamu inginkan.
Kode untuk mereproduksi plot:
2.
sumber
Jika Anda ingin menghitung semua nilai sekaligus, Anda dapat melakukannya dengan sangat cepat menggunakan numpy array dan
bincount
sebagai berikutpemberian yang mana
sumber
Jika Anda dapat menggunakan
pandas
, makavalue_counts
ada untuk penyelamatan.Secara otomatis mengurutkan hasil berdasarkan frekuensi juga.
Jika Anda ingin hasilnya ada dalam daftar, lakukan seperti di bawah ini
sumber
Mengapa tidak menggunakan Panda?
Keluaran:
Jika Anda mencari hitungan elemen tertentu, katakan a , coba:
Keluaran:
sumber
Saya memiliki masalah ini hari ini dan memutar solusi saya sendiri sebelum saya berpikir untuk memeriksa SO. Ini:
benar-benar lambat untuk daftar besar. Solusi saya
sebenarnya sedikit lebih cepat daripada solusi Counter, setidaknya untuk Python 2.7.
sumber
sumber
Di bawah ini adalah tiga solusi:
Tercepat menggunakan for for dan menyimpannya dalam Dict.
Hasil
sumber
Hitung semua elemen dengan
itertools.groupby()
Kemungkinan lebih lanjut untuk mendapatkan jumlah semua elemen dalam daftar bisa melalui
itertools.groupby()
.Dengan jumlah "duplikat"
Kembali
Perhatikan bagaimana ini menggabungkan tiga yang pertama
a
sebagai kelompok pertama, sementara kelompok laina
hadir lebih jauh dalam daftar. Ini terjadi karena daftar inputL
tidak diurutkan. Ini bisa bermanfaat kadang-kadang jika kelompok sebenarnya terpisah.Dengan jumlah unik
Jika jumlah kelompok unik diinginkan, cukup sortir daftar input:
Kembali
Catatan: Untuk membuat hitungan unik, banyak jawaban lain memberikan kode yang lebih mudah dan lebih mudah dibaca dibandingkan dengan
groupby
solusinya. Tetapi ditunjukkan di sini untuk menggambar paralel dengan contoh jumlah duplikat.sumber
Disarankan untuk menggunakan bincount numpy , namun hanya berfungsi untuk array 1d dengan bilangan bulat non-negatif . Juga, array yang dihasilkan mungkin membingungkan (berisi kemunculan bilangan bulat dari min ke maks dari daftar asli, dan set ke 0 bilangan yang hilang).
Cara yang lebih baik untuk melakukannya dengan numpy adalah menggunakan fungsi unik dengan atribut
return_counts
disetel ke True. Ini mengembalikan tuple dengan array nilai unik dan array kemunculan setiap nilai unik.dan kemudian kita bisa memasangkannya sebagai
Ini juga bekerja dengan tipe data lain dan "daftar 2d", misalnya
sumber
Untuk menghitung jumlah elemen beragam yang memiliki tipe umum:
memberi
3
, bukan 6sumber
Meskipun ini adalah pertanyaan yang sangat lama, tetapi karena saya tidak menemukan satu liner, saya membuatnya.
sumber
Anda juga dapat menggunakan
countOf
metode modul bawaanoperator
.sumber
countOf
penerapannya? Bagaimana cara membandingkannya dengan yang lebih jelaslist.count
(yang diuntungkan dari implementasi C)? Apakah ada kelebihannya?Mungkin bukan yang paling efisien, memerlukan izin ekstra untuk menghapus duplikat.
Implementasi fungsional:
pengembalian:
atau kembali sebagai
dict
:pengembalian:
sumber
Ini akan mengembalikan jumlah kemunculan nilai_Anda
sumber
Saya akan menggunakan
filter()
, ambil contoh Lukasz:sumber
jika Anda menginginkan sejumlah kemunculan untuk elemen tertentu:
sumber
sumber
ini akan menghitung berulang atau mencari item dalam daftar bahkan jika itu dalam daftar daftar
sumber