Python menyediakan beberapa fungsi bawaan yang menyederhanakan kebutuhan iterasi yang muncul setiap hari, yaitu zip untuk menyatukan beberapa urutan, enumerate untuk menomori iterasi, reversed untuk membaca urutan dari belakang, dan sorted untuk pengurutan dengan aturan yang dapat diatur lewat argumen key. Topik ini membahas perilaku masing-masing fungsi, cara menentukan urutan khusus, serta program utuh yang menyusun peringkat nilai ujian.
zip menyatukan beberapa urutan#
Fungsi zip menerima beberapa iterable dan menghasilkan pasangan tuple yang menyatukan elemen-elemen pada posisi yang sama, sehingga dua daftar yang sejajar dapat dijelajahi dalam satu perulangan. Nama fungsinya merujuk pada ritsleting, karena elemen-elemen dari kiri dan kanan disatukan gigi demi gigi. Hasilnya berupa iterator yang mengikuti protokol iterasi, sehingga pemakaian ulang memerlukan panggilan zip baru.
nama = ["Ali", "Budi", "Citra"]
nilai = [82, 90, 75]
for n, v in zip(nama, nilai):
print(f"{n}: {v}")
print(dict(zip(nama, nilai)))Ali: 82
Budi: 90
Citra: 75
{'Ali': 82, 'Budi': 90, 'Citra': 75}Baris dict(zip(nama, nilai)) merupakan idiom yang lazim untuk membangun dictionary dari daftar kunci dan daftar nilainya. zip menerima lebih dari dua argumen, dan setiap putaran menghasilkan tuple sepanjang jumlah argumennya. Arah sebaliknya juga lazim dipakai, yaitu zip(*pasangan) yang membongkar daftar pasangan menjadi tuple terpisah per kolom, sehingga data yang tadinya digandengkan dapat dipisahkan kembali tanpa perulangan manual. Apabila panjang kedua urutan berbeda, zip berhenti pada urutan yang paling pendek dan tidak memberi sinyal apa pun, sehingga kejanggalan data dapat lolos tanpa terdeteksi. Sejak Python 3.10 tersedia argumen strict=True yang menimbulkan error ketika panjangnya tidak sama, dan perbedaannya dibahas pada bagian kesalahan umum.
enumerate menomori iterasi#
Fungsi enumerate menghasilkan pasangan nomor urut dan elemen pada setiap putaran, dengan nomor awal yang dapat diatur lewat argumen start. Bentuk for i, v in enumerate(data) menggantikan pola for i in range(len(data)) yang lebih panjang dan lebih mudah salah, karena nomor dan nilai datang dari satu sumber yang sama.
kota = ["Bandung", "Semarang", "Denpasar"]
for urutan, nama in enumerate(kota, start=1):
print(f"{urutan}. {nama}")
print(list(enumerate(kota, start=1)))1. Bandung
2. Semarang
3. Denpasar
[(1, 'Bandung'), (2, 'Semarang'), (3, 'Denpasar')]Argumen start=1 membuat penomoran cocok untuk daftar bernomor yang dibaca manusia, sedangkan tanpa argumen itu nomor dimulai dari nol sesuai konvensi indeks Python. Fungsi ini bekerja atas iterable apa pun, termasuk iterator yang panjangnya belum diketahui, karena nomor dibangkitkan bersamaan dengan datangnya elemen. Bentuk unpacking urutan, nama pada kepala perulangan memisahkan pasangan tanpa langkah tambahan, dan pola yang sama berlaku atas hasil zip.
reversed dan sorted#
Fungsi reversed menghasilkan iterator yang membaca sebuah sekuens dari belakang ke depan, sedangkan sorted mengembalikan list baru yang isinya terurut menaik secara default. Keduanya tidak mengubah data aslinya, sehingga urutan semula tetap utuh setelah diproses. Fungsi sorted menerima argumen reverse=True untuk urutan menurun, sedangkan reversed murni membalik arah baca tanpa mengurutkan apa pun.
angka = [1, 2, 3, 4]
print(list(reversed(angka)))
print("".join(reversed("peta")))
print(angka)
print(sorted(angka, reverse=True))[4, 3, 2, 1]
atep
[1, 2, 3, 4]
[4, 3, 2, 1]Pemanggilan reversed("peta") menghasilkan huruf-huruf dalam urutan terbalik, dan metode join menyusunnya menjadi string atep. Cetakan ketiga menegaskan bahwa angka tidak berubah, dan baris keempat menunjukkan sorted dengan urutan menurun. Fungsi sorted menerima iterable apa pun, termasuk set dan generator, dan selalu mengembalikan list baru yang boleh diindeks dan diiterasi ulang, sedangkan hasil reversed tetap berupa iterator sekali lewat. Fungsi min() dan max() juga menerima argumen key dengan semantik yang sama, sehingga kriteria pembanding dapat dipakai ulang di antara keduanya.
Argumen key untuk urutan khusus#
Argumen key menerima fungsi yang dipanggil satu kali untuk setiap elemen, dan nilai kembaliannya yang dipakai sebagai dasar perbandingan. Cara ini membuat sorted fleksibel tanpa mengubah elemen, karena yang diurutkan tetap elemen asli, sementara kunci hanya berperan sebagai alat banding. Pengurutan bawaan Python juga stabil, yaitu elemen dengan kunci yang sama mempertahankan urutan aslinya.
kata = ["durian", "pisang", "apel", "jeruk"]
print(sorted(kata))
print(sorted(kata, key=len))
print(sorted(kata, key=len, reverse=True))['apel', 'durian', 'jeruk', 'pisang']
['apel', 'jeruk', 'durian', 'pisang']
['durian', 'pisang', 'jeruk', 'apel']Pengurutan pertama mengikuti abjad, sedangkan yang kedua mengikuti panjang kata dan menjaga urutan abjad untuk kata yang sama panjangnya karena sifat stabil. Untuk aturan bertingkat, kuncinya dapat berupa tuple, karena perbandingan tuple membandingkan unsur pertama terlebih dahulu lalu unsur berikutnya.
siswa = [("Budi", 88), ("Ali", 88), ("Citra", 91)]
print(sorted(siswa, key=lambda s: (-s[1], s[0])))[('Citra', 91), ('Ali', 88), ('Budi', 88)]Kunci (-s[1], s[0]) mengurutkan nilai dari yang tertinggi melalui tanda negatif, lalu nama menaik sebagai pemecah kesamaan, sehingga Ali mendahului Budi pada nilai yang sama. Pola kunci tuple ini menghindari pengurutan berlapis yang harus dijalankan dua kali dan rentan salah urut.
Program utuh: daftar peringkat#
Program berikut menggabungkan sorted dengan kunci bertingkat dan enumerate untuk menyusun peringkat nilai ujian. Fungsi tampilkan_peringkat menerima daftar data siswa, mengurutkannya sekali, lalu mencetak setiap baris dengan nomor peringkat yang dimulai dari satu.
def tampilkan_peringkat(siswa):
terurut = sorted(siswa, key=lambda s: (-s["nilai"], s["nama"]))
for peringkat, s in enumerate(terurut, start=1):
print(f"{peringkat}. {s['nama']:<6} {s['nilai']}")
daftar_siswa = [
{"nama": "Budi", "nilai": 88},
{"nama": "Ali", "nilai": 88},
{"nama": "Citra", "nilai": 91},
{"nama": "Dewi", "nilai": 75},
]
tampilkan_peringkat(daftar_siswa)1. Citra 91
2. Ali 88
3. Budi 88
4. Dewi 75Urutan keluarannya mengikuti dua aturan sekaligus, yaitu nilai dari yang tertinggi dan nama menaik untuk nilai yang sama. Lebar kolom nama diatur dengan penentu format :<6, sehingga angka peringkat dan nilai tersaji rapi dalam kolom. Data sumbernya dapat berupa daftar dictionary dengan struktur yang sama tanpa mengubah fungsinya sama sekali, karena semua kriteria tertanam pada kunci pengurutan.
Kesalahan umum#
Kesalahan pertama adalah mengandalkan perilaku zip yang berhenti di urutan terpendek tanpa sadar. Ketika dua daftar seharusnya sama panjang, kelebihan data pada salah satunya hilang diam-diam, dan argumen strict=True mengubah kejadian itu menjadi error yang terlihat.
try:
list(zip(["a", "b", "c"], [1, 2], strict=True))
except ValueError as e:
print(type(e).__name__, str(e))ValueError zip() argument 2 is shorter than argument 1Kesalahan kedua adalah membalik arah iterator seperti generator dengan reversed. Fungsi ini menuntut sekuens yang dapat diindeks dari belakang, sehingga pemanggilannya atas generator ekspresi menimbulkan error TypeError.
try:
reversed(x for x in range(3))
except TypeError as e:
print(type(e).__name__, str(e))TypeError 'generator' object is not reversibleKebalikan arah generator dilakukan dengan mengumpulkannya lebih dahulu menjadi list, lalu memanggil reversed atas list itu. Kesalahan ketiga adalah mencampuradukkan sorted() dengan metode sort() milik list. Fungsi sorted() mengembalikan list baru dan membiarkan aslinya utuh, sedangkan metode sort() mengubah list pemanggilnya dan mengembalikan None, sehingga pola a = a.sort() mengganti a dengan None dan datanya seolah hilang. Aturan pemilihannya sederhana, yaitu sort() untuk list yang memang boleh berubah dan sorted() untuk salinan terurut atau sumber lain seperti tuple dan set.
Ringkasan#
zipmenyatukan beberapa iterable menjadi pasangan tuple dan berhenti pada urutan terpendek, kecualistrict=Truedipakai.enumeratemenyediakan nomor urut bersama elemennya, dengan titik awal yang diatur lewatstart.reversedmembalik arah baca sebuah sekuens, sedangkansortedmengembalikan list baru tanpa mengubah data aslinya.- Argumen
keymenentukan dasar perbandingan, dan kunci tuple menangani pengurutan bertingkat pada pengurutan yang stabil.
Referensi#
- Built-in Functions — Python Software Foundation — Dokumentasi resmi zip, enumerate, reversed, dan sorted pada satu halaman.
- Sorting HOW TO — Python Software Foundation — Panduan resmi pengurutan dengan argumen key dan sifat stabilitasnya.