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:

python
from itertools import count, cycle, islice

print(list(islice(count(10, 5), 4)))
print(list(islice(cycle(["A", "B"]), 5)))

Output yang Dihasilkan:

text
[10, 15, 20, 25]
['A', 'B', 'A', 'B', 'A']

Mari kita bedah kode di atas:

  1. Baris 3 (count(10, 5)): menghasilkan 10, 15, 20, 25, ... tanpa akhir, bertambah 5 setiap langkah — seperti range() tanpa batas atas.
  2. Baris 4 (cycle(["A", "B"])): mengulang sequence yang sama selamanya; islice(..., 5) mengambil lima elemen pertama sehingga pola A B terpotong di A.

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:

python
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:

text
[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:

python
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:

text
[(0, 0), (0, 1), (1, 0), (1, 1)]
[('A', 'B'), ('B', 'A')]
[('A', 'B')]
FunctionUrutan diperhatikan?Elemen boleh berulang?
productYaYa (seperti loop bersarang)
permutationsYaTidak
combinationsTidakTidak

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:

python
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:

text
rabu 90
selasa 350
senin 200

Mari kita bedah kode di atas:

  1. Baris 11 (transaksi.sort(...)): mengurutkan transaksi berdasarkan nama hari. Tanpa baris ini, dua transaksi "selasa" yang terpisah oleh "rabu" akan membentuk dua kelompok selasa yang terpisah — sumber bug klasik.
  2. Baris 13 (groupby(transaksi, key=...)): membentuk kelompok berurutan; setiap kelompok adalah iterator berisi elemen dengan key yang sama.
  3. 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.