enumerate dan zip
Dua kebutuhan yang muncul terus-menerus dalam perulangan, dan dua fungsi bawaan yang menyelesaikannya dalam satu baris.
Intisari
enumerate(data)memberi nomor urut + item sekaligus dalam satu perulangan.- Nomor mulai dari 0. Untuk mulai dari 1:
enumerate(data, start=1). zip(a, b)menyusuri dua list berdampingan, item ke-1 dengan item ke-1, dan seterusnya.zipberhenti di list terpendek โ sisanya diabaikan diam-diam.- Keduanya membuat
for i in range(len(data))jadi hampir tidak pernah dibutuhkan lagi.
enumerate โ nomor urut tanpa repot
Kamu ingin mencetak daftar bernomor. Cara manualnya:
buah = ["apel", "jeruk", "mangga"]
nomor = 1
for b in buah:
print(f"{nomor}. {b}")
nomor += 1
Dengan enumerate, dua baris pengurus nomor itu hilang:
for nomor, b in enumerate(buah, start=1):
print(f"{nomor}. {b}")
1. apel
2. jeruk
3. mangga
Perhatikan ada DUA variabel di antara for dan in, dipisah koma.
enumerate menyerahkan sepasang nilai tiap putaran โ nomornya dan itemnya โ dan
Python membongkar pasangan itu ke dua variabel sekaligus.
Tanpa start=1, nomornya mulai dari 0 โ yang justru berguna kalau nomor itu dipakai sebagai indeks:
for i, b in enumerate(buah):
print(i, b) # 0 apel / 1 jeruk / 2 mangga
zip โ dua daftar sekaligus
Kamu punya dua list yang isinya berpasangan menurut posisi:
nama = ["Ani", "Budi", "Cici"]
nilai = [85, 90, 78]
for n, v in zip(nama, nilai):
print(f"{n}: {v}")
Ani: 85
Budi: 90
Cici: 78
Bandingkan dengan cara manual yang harus mengurus indeks sendiri:
for i in range(len(nama)):
print(f"{nama[i]}: {nilai[i]}")
Hasilnya sama, tapi versi zip tidak bisa salah indeks โ dan kalau salah satu list lebih pendek, ia tidak error.
zip berhenti di yang terpendek. Kalau nama berisi 3 item dan
nilai hanya 2, perulangan berjalan 2 kali dan item ketiga hilang tanpa peringatan apa pun.
Kalau data yang tidak sama panjang itu tanda ada masalah, cek dulu:
if len(nama) != len(nilai):.
Menggabungkan keduanya
for i, (n, v) in enumerate(zip(nama, nilai), start=1):
status = "lulus" if v >= 80 else "gagal"
print(f"{i}. {n:<8} {v:>3} {status}")
1. Ani 85 lulus
2. Budi 90 lulus
3. Cici 78 gagal
Ringkasan
| Kebutuhan | Tulis |
|---|---|
| Item saja | for x in data: |
| Item + nomor urut | for i, x in enumerate(data): |
| Item + nomor mulai 1 | for i, x in enumerate(data, start=1): |
| Dua list berpasangan | for a, b in zip(list1, list2): |
| Sekadar mengulang n kali | for _ in range(n): |
Kalau kamu mendapati dirimu menulis for i in range(len(sesuatu)), hampir selalu ada
satu baris dari tabel di atas yang lebih tepat.
Latihan: punya list nama siswa dan list nilainya. Cetak daftar bernomor, tandai siswa dengan nilai tertinggi, dan tampilkan rata-rata kelas di baris terakhir.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.