Saya belum dapat menemukan penjelasan yang dapat dimengerti tentang bagaimana sebenarnya menggunakan itertools.groupby()
fungsi Python . Yang saya coba lakukan adalah ini:
- Ambil daftar - dalam hal ini, anak-anak dari
lxml
elemen yang diobjekkan - Bagilah menjadi beberapa kelompok berdasarkan beberapa kriteria
- Kemudian, ulangi masing-masing kelompok ini secara terpisah.
Saya telah meninjau dokumentasi , dan contoh-contohnya , tetapi saya mengalami kesulitan mencoba menerapkannya di luar daftar angka sederhana.
Jadi, bagaimana saya menggunakan itertools.groupby()
? Apakah ada teknik lain yang harus saya gunakan? Petunjuk untuk bacaan "prasyarat" yang baik juga akan dihargai.
Jawaban:
CATATAN PENTING: Anda harus mengurutkan data Anda terlebih dahulu.
Bagian yang saya tidak dapatkan adalah bahwa dalam contoh konstruksi
k
adalah kunci pengelompokan saat ini, dang
merupakan iterator yang dapat Anda gunakan untuk beralih di atas grup yang ditentukan oleh kunci pengelompokan itu. Dengan kata lain,groupby
iterator itu sendiri mengembalikan iterator.Berikut ini contohnya, menggunakan nama variabel yang lebih jelas:
Ini akan memberi Anda output:
Dalam contoh ini,
things
adalah daftar tuple di mana item pertama di setiap tuple adalah grup item kedua.The
groupby()
Fungsi membutuhkan dua argumen: (1) data ke kelompok dan (2) fungsi untuk kelompok dengan.Di sini,
lambda x: x[0]
diperintahkangroupby()
untuk menggunakan item pertama di setiap tuple sebagai kunci pengelompokan.Dalam
for
pernyataan di atas ,groupby
mengembalikan tiga pasang (kunci, grup iterator) - satu kali untuk setiap kunci unik. Anda dapat menggunakan iterator yang dikembalikan untuk beralih setiap item individu dalam grup itu.Berikut adalah contoh yang sedikit berbeda dengan data yang sama, menggunakan pemahaman daftar:
Ini akan memberi Anda output:
sumber
groupby(sorted(my_collection, key=lambda x: x[0]), lambda x: x[0]))
dengan asumsi itumy_collection = [("animal", "bear"), ("plant", "cactus"), ("animal", "duck")]
dan Anda ingin dikelompokkan berdasarkananimal or plant
Contoh pada dokumen Python cukup mudah:
Jadi dalam kasus Anda, data adalah daftar node,
keyfunc
adalah tempat logika fungsi kriteria Anda berjalan dan kemudiangroupby()
mengelompokkan data.Anda harus berhati-hati untuk mengurutkan data berdasarkan kriteria sebelum Anda menelepon
groupby
atau itu tidak akan berfungsi.groupby
Metode sebenarnya hanya mengulang melalui daftar dan setiap kali kunci itu berubah itu membuat grup baru.sumber
keyfunc
dan seperti "ya, saya tahu persis apa itu karena dokumentasi ini cukup mudah."? Luar biasa!itertools.groupby
adalah alat untuk mengelompokkan item.Dari dokumen , kami mengumpulkan lebih lanjut apa yang mungkin dilakukan:
groupby
objek menghasilkan pasangan-pasangan kunci-grup di mana grup tersebut adalah generator.fitur
Perbandingan
Penggunaan
Catatan: Beberapa contoh terakhir berasal dari PyCon (bicara) Víctor Terrón (Spanyol) , "Kung Fu at Dawn with Itertools". Lihat juga
groupby
kode sumber yang ditulis dalam C.* Fungsi di mana semua item dilewati dan dibandingkan, mempengaruhi hasilnya. Objek lain dengan fungsi utama meliputi
sorted()
,max()
danmin()
.Tanggapan
sumber
[''.join(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
.list()
,tuple()
) atau dikonsumsi dalam satu lingkaran / pemahaman untuk menampilkan konten. Ini adalah redudansi yang kemungkinan besar dikecualikan penulis untuk menghemat ruang.Trik neato dengan groupby adalah menjalankan pengkodean panjang dalam satu baris:
akan memberi Anda daftar 2-tupel di mana elemen pertama adalah char dan yang kedua adalah jumlah pengulangan.
Sunting: Perhatikan bahwa ini adalah apa yang terpisah
itertools.groupby
dariGROUP BY
semantik SQL : itertools tidak (dan secara umum tidak dapat) mengurutkan iterator terlebih dahulu, sehingga grup dengan "kunci" yang sama tidak digabungkan.sumber
Contoh lain:
hasil dalam
Perhatikan bahwa igroup adalah iterator (sub-iterator sesuai dengan dokumentasi menyebutnya).
Ini berguna untuk memotong generator:
Contoh lain dari groupby - ketika kunci tidak diurutkan. Dalam contoh berikut, item dalam xx dikelompokkan berdasarkan nilai dalam yy. Dalam hal ini, satu set nol adalah output pertama, diikuti oleh satu set, diikuti lagi oleh set nol.
Menghasilkan:
sumber
PERINGATAN:
Daftar sintaks (groupby (...)) tidak akan berfungsi seperti yang Anda inginkan. Tampaknya untuk menghancurkan objek iterator internal, jadi gunakan
akan menghasilkan:
Alih-alih, dari list (groupby (...)), coba [(k, list (g)) untuk k, g di groupby (...)], atau jika Anda sering menggunakan sintaks itu,
dan mendapatkan akses ke fungsi groupby sambil menghindari iterator yang sial (untuk data kecil) bersama-sama.
sumber
Saya ingin memberikan contoh lain di mana groupby tanpa sort tidak berfungsi. Diadaptasi dari contoh oleh James Sulak
output adalah
ada dua kelompok dengan kendaraan, sedangkan yang bisa diharapkan hanya satu kelompok
sumber
@ CapSolo, saya mencoba contoh Anda, tetapi tidak berhasil.
Keluaran:
Seperti yang Anda lihat, ada dua dan dua, tetapi mereka masuk ke dalam kelompok yang terpisah. Saat itulah saya menyadari Anda perlu mengurutkan daftar yang diteruskan ke fungsi groupby. Jadi, penggunaan yang benar adalah:
Keluaran:
Hanya dengan mengingat, jika daftar tidak diurutkan, fungsi groupby tidak akan berfungsi !
sumber
sumber
Anda dapat menggunakan groupby untuk mengelompokkan hal-hal yang harus diulangi. Anda memberi grup dengan iterable, dan fungsi kunci opsional / callable yang digunakan untuk memeriksa item ketika mereka keluar dari iterable, dan itu mengembalikan iterator yang memberikan dua-tuple dari hasil callable kunci dan item aktual dalam iterable lain. Dari bantuan:
Berikut adalah contoh pengelompokan dengan menggunakan coroutine untuk dikelompokkan berdasarkan suatu hitungan, ia menggunakan pemanggil kunci (dalam hal ini,
coroutine.send
) untuk hanya memuntahkan hitungan untuk berapa banyak iterasi dan sub-iterator elemen yang dikelompokkan:cetakan
sumber
Salah satu contoh berguna yang saya temui mungkin membantu:
Input sampel: 14445221
Output sampel: (1,1) (3,4) (1,5) (2,2) (1,1)
sumber
Implementasi dasar ini membantu saya memahami fungsi ini. Semoga ini membantu orang lain juga:
sumber
Anda dapat menulis fungsi groupby sendiri:
sumber