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:

python
bulan = ["jan", "feb", "mar", "apr"]

for b in reversed(bulan):
    print(b)

print(bulan)

Output yang Dihasilkan:

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

python
urutan = reversed([1, 2, 3])

print(next(urutan), next(urutan), next(urutan))

teks = "python"
print(teks[::-1])
print("".join(reversed(teks)))

Output yang Dihasilkan:

text
3 2 1
nohtyp
nohtyp

Baris 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.

Aspekreversed(bulan)bulan[::-1]
Hasiliterator lazysalinan list baru (segera)
Memorikonstan, tanpa salinansebesar datanya sendiri
Sumber yang didukungsequence sajasequence saja

Karena hanya bekerja pada sequence — data berurutan yang panjangnya diketahui — reversed() menolak struktur tanpa urutan seperti set:

python
>>> reversed({"merah", "hijau"})
Traceback (most recent call last):
    ...
TypeError: 'set' object is not reversible

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

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

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

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

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

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

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

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

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

python
harga = [3000, 1500, 5000]

print(sorted(harga))
print(harga)

hasil = harga.sort()
print(harga)
print(hasil)

Output yang Dihasilkan:

text
[1500, 3000, 5000]
[3000, 1500, 5000]
[1500, 3000, 5000]
None
Aspeksorted(data)data.sort()
Mengubah data aslitidakya, di tempat
Nilai baliklist terurut baruNone
Sumber yang didukungiterable apa punhanya list
Kapan dipakaibutuh urutan tanpa merusak aslinyacukup 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.