Urutan tampilan jarang sama dengan urutan penyimpanan: daftar transaksi tampil terbaru dulu, papan peringkat tampil skor tertinggi dulu, laporan tampil alfabetis. Python menyediakan dua fungsi bawaan untuk pekerjaan tersebut — reversed() membaca data dari belakang, sorted() menyusun ulang menurut aturan tertentu. Keduanya non-destruktif: data asli tidak pernah diubah, dan keduanya sudah kita pakai sekilas pada Chapter Iterasi Collections; sekarang kita bedah kendali penuhnya.
Membaca dari Belakang dengan reversed() #
Fungsi reversed() menerima sebuah sequence dan menghasilkan iterator yang membacanya dari elemen terakhir ke elemen pertama:
bulan = ["jan", "feb", "mar", "apr"]
for b in reversed(bulan):
print(b)
print(bulan)Output yang Dihasilkan:
apr
mar
feb
jan
['jan', 'feb', 'mar', 'apr']Loop mencetak dari apr turun ke jan, sementara list bulan tetap utuh — reversed() tidak membalik list-nya, hanya cara membacanya. Buktinya, baris terakhir mencetak list asli yang tidak tersentuh.
reversed() bersifat lazy persis seperti generator expression: tidak ada salinan data yang dibuat. Karena kita sudah menguasai iter() dan next(), sifat iterator itu bisa dibuktikan langsung:
urutan = reversed([1, 2, 3])
print(next(urutan), next(urutan), next(urutan))
teks = "python"
print(teks[::-1])
print("".join(reversed(teks)))Output yang Dihasilkan:
3 2 1
nohtyp
nohtypBaris 3 menarik nilai satu per satu lewat next() — perilaku yang hanya mungkin pada iterator. Dua baris terakhir membalik string dengan dua cara: slicing [::-1] yang langsung membuat string baru terbalik, dan "".join(reversed(teks)) yang membaca iteratornya lalu menggabungkan hasilnya.
| Aspek | reversed(bulan) | bulan[::-1] |
|---|---|---|
| Hasil | iterator lazy | salinan list baru (segera) |
| Memori | konstan, tanpa salinan | sebesar datanya sendiri |
| Sumber yang didukung | sequence saja | sequence saja |
Karena hanya bekerja pada sequence — data berurutan yang panjangnya diketahui — reversed() menolak struktur tanpa urutan seperti set:
>>> reversed({"merah", "hijau"})
Traceback (most recent call last):
...
TypeError: 'set' object is not reversibleUntuk mengurutkan data semacam itu, kita pindah ke fungsi kedua.
Mengurutkan dengan sorted() #
sorted() menerima iterable apa pun dan selalu mengembalikan list baru yang terurut — set dan dictionary pun sah, karena keduanya bisa diiterasi:
angka = [3, 1, 4, 1, 5]
buah = ["mangga", "apel", "jeruk"]
skor = {"budi": 80, "siti": 95, "agus": 70}
print(sorted(angka))
print(sorted(buah))
print(sorted(skor))
print(angka)Output yang Dihasilkan:
[1, 1, 3, 4, 5]
['apel', 'jeruk', 'mangga']
['agus', 'budi', 'siti']
[3, 1, 4, 1, 5]Dictionary diiterasi berdasarkan key, sehingga sorted(skor) menghasilkan daftar nama terurut alfabetis. List angka asli tetap berantakan — semua pengurutan terjadi di list baru.
Dua parameter mengubah aturan urutnya. key= menerima fungsi penghitung “nilai pembanding” per elemen, dan reverse=True membalik arah urutan:
buah = ["mangga", "kiwi", "apel", "pisang"]
print(sorted(buah))
print(sorted(buah, key=len))
print(sorted(buah, key=len, reverse=True))
print(sorted(buah, reverse=True))Output yang Dihasilkan:
['apel', 'kiwi', 'mangga', 'pisang']
['kiwi', 'apel', 'mangga', 'pisang']
['mangga', 'pisang', 'kiwi', 'apel']
['pisang', 'mangga', 'kiwi', 'apel']Pada baris 4, key=len menyuruh sorted() membandingkan panjang kata, bukan urutan hurufnya. Hasilnya kiwi dan apel (4 huruf) duluan, disusul mangga dan pisang (6 huruf).
Mengurutkan Tuple dan Item Dictionary #
Tuple dibandingkan elemen demi elemen dari kiri, sehingga list berisi tuple terurut otomatis menurut elemen pertamanya. Untuk mengurutkan menurut elemen lain, kita perlu key= berbentuk lambda — fungsi kecil satu baris tanpa nama yang dibahas tuntas di Section Fungsi; untuk sekarang, anggap lambda p: p[1] sebagai resep “ambil elemen kedua”:
peserta = [("Budi", 88), ("Siti", 95), ("Agus", 88), ("Dewi", 95)]
urut_skor = sorted(peserta, key=lambda p: p[1], reverse=True)
print(urut_skor)Output yang Dihasilkan:
[('Siti', 95), ('Dewi', 95), ('Budi', 88), ('Agus', 88)]Pengurutan Python bersifat stabil: elemen dengan nilai pembanding sama mempertahankan urutan aslinya. “Siti” muncul sebelum “Dewi” karena keduanya bernilai 95 dan “Siti” lebih dulu di data sumber — sama halnya “kiwi” sebelum “apel” pada contoh key=len sebelumnya. Pola yang sama mengurutkan dictionary berdasarkan value:
skor = {"budi": 80, "siti": 95, "agus": 70}
print(sorted(skor.items()))
print(sorted(skor.items(), key=lambda item: item[1], reverse=True))Output yang Dihasilkan:
[('agus', 70), ('budi', 80), ('siti', 95)]
[('siti', 95), ('budi', 80), ('agus', 70)]Tanpa key=, .items() terurut menurut key (elemen pertama tuple). Dengan key=lambda item: item[1], urutan mengikuti value — dari skor tertinggi.
list.sort() versus sorted() #
List punya method .sort() sendiri yang mengurutkan di tempat (in-place), tanpa membuat list baru:
harga = [3000, 1500, 5000]
print(sorted(harga))
print(harga)
hasil = harga.sort()
print(harga)
print(hasil)Output yang Dihasilkan:
[1500, 3000, 5000]
[3000, 1500, 5000]
[1500, 3000, 5000]
None| Aspek | sorted(data) | data.sort() |
|---|---|---|
| Mengubah data asli | tidak | ya, di tempat |
| Nilai balik | list terurut baru | None |
| Sumber yang didukung | iterable apa pun | hanya list |
| Kapan dipakai | butuh urutan tanpa merusak aslinya | cukup satu urutan, hemat memori |
Dua fungsi penutup section ini melengkapi kotak perkakas iterasi kita — dari comprehension yang membangun koleksi, protokol iterator yang menjadi mesinnya, sampai utilitas enumerate(), zip(), reversed(), dan sorted() yang membuat pola berulang tinggal dipanggil.