Menggabungkan tiga list penjualan, menghasilkan semua kombinasi password, menjumlahkan berjalan — semua tugas ini bisa diselesaikan dengan loop bersarang, tetapi kodenya mudah melebar dan boros memori. Module itertools menyediakan blok bangunan berbasis lazy iterator: elemen hanya dihitung saat dibutuhkan. Pada Chapter ini kita kelompokkan fungsinya ke dalam tiga kategori agar mudah diingat.
Iterator Tak Terbatas: count, cycle, islice #
count() dan cycle() menghasilkan nilai tanpa henti, sehingga wajib dipasangkan dengan islice() yang memotong sejumlah elemen:
from itertools import count, cycle, islice
print(list(islice(count(10, 5), 4)))
print(list(islice(cycle(["A", "B"]), 5)))Output yang Dihasilkan:
[10, 15, 20, 25]
['A', 'B', 'A', 'B', 'A']Mari kita bedah kode di atas:
- Baris 3 (
count(10, 5)): menghasilkan10, 15, 20, 25, ...tanpa akhir, bertambah 5 setiap langkah — sepertirange()tanpa batas atas. - Baris 4 (
cycle(["A", "B"])): mengulang sequence yang sama selamanya;islice(..., 5)mengambil lima elemen pertama sehingga polaA Bterpotong diA.
Iterator Terbatas: chain, accumulate, starmap #
Kategori kedua bekerja pada iterator yang sudah ada. chain() menyambung beberapa iterable menjadi satu aliran, accumulate() menjumlahkan berjalan, dan starmap() membongkar argumen dari tuple:
from itertools import chain, accumulate, starmap
senin = [100, 150]
selasa = [200]
rabu = [90, 120, 175]
print(list(chain(senin, selasa, rabu)))
print(list(accumulate([100, 50, -30, 20])))
print(list(starmap(pow, [(2, 3), (4, 2)])))Output yang Dihasilkan:
[100, 150, 200, 90, 120, 175]
[100, 150, 120, 140]
[8, 16]Baris accumulate menghasilkan saldo berjalan 100 → 150 → 120 → 140 — tiap elemen adalah penjumlahan semua elemen sebelumnya. Sementara starmap(pow, [(2, 3), (4, 2)]) memecah setiap tuple (2, 3) menjadi dua argumen untuk pow(2, 3) = 8, seperti versi map() untuk function multi-argumen.
Kombinatorika: product, permutations, combinations #
Tiga function ini menghasilkan kemungkinan dari sekumpulan item. Perbedaannya pada apakah urutan diperhatikan dan pengulangan diizinkan:
from itertools import product, permutations, combinations
print(list(product([0, 1], repeat=2)))
print(list(permutations("AB")))
print(list(combinations("AB", 2)))Output yang Dihasilkan:
[(0, 0), (0, 1), (1, 0), (1, 1)]
[('A', 'B'), ('B', 'A')]
[('A', 'B')]| Function | Urutan diperhatikan? | Elemen boleh berulang? |
|---|---|---|
product | Ya | Ya (seperti loop bersarang) |
permutations | Ya | Tidak |
combinations | Tidak | Tidak |
Hasil product([0, 1], repeat=2) berisi empat pasangan termasuk (0, 0) dan (1, 1) — padanan tepat untuk dua loop for bersarang. permutations("AB") menganggap ('A', 'B') dan ('B', 'A') berbeda, sedangkan combinations("AB", 2) hanya menghasilkan satu pasangan karena urutan diabaikan.
groupby: Urutkan Dulu! #
Function groupby() mengelompokkan elemen berurutan yang memiliki key sama. Kata kuncinya: berurutan. Karena groupby() berhenti membuat kelompok begitu key berubah, data mentah harus diurutkan lebih dulu berdasarkan key yang sama:
from itertools import groupby
transaksi = [
("senin", 120),
("senin", 80),
("selasa", 200),
("rabu", 90),
("selasa", 150),
]
transaksi.sort(key=lambda t: t[0])
for hari, kelompok in groupby(transaksi, key=lambda t: t[0]):
total = sum(t[1] for t in kelompok)
print(hari, total)Output yang Dihasilkan:
rabu 90
selasa 350
senin 200Mari kita bedah kode di atas:
- Baris 11 (
transaksi.sort(...)): mengurutkan transaksi berdasarkan nama hari. Tanpa baris ini, dua transaksi"selasa"yang terpisah oleh"rabu"akan membentuk dua kelompokselasayang terpisah — sumber bug klasik. - Baris 13 (
groupby(transaksi, key=...)): membentuk kelompok berurutan; setiap kelompok adalah iterator berisi elemen dengan key yang sama. - Baris 14 (
sum(t[1] for t in kelompok)): menjumlahkan nilai di dalam kelompok saat itu juga, karena iterator kelompok tidak bisa diputar ulang.
Urutan hasil mengikuti urutan alfabetis (rabu, selasa, senin) karena kita mengurutkan berdasarkan string. Jika butuh urutan kronologis, gunakan key berupa angka hari.
Sebagai peta penutup, ingat tiga kategori ini: tak terbatas (count, cycle), terbatas (chain, accumulate, starmap, islice), dan kombinatorika (product, permutations, combinations). Dengan tiga belas function inti ini, mayoritas pipeline data sehari-hari bisa ditulis tanpa loop manual sama sekali.