BAB 14: List
Kenali list sebagai struktur data kolektif pertama di Python — cara membuat, mengakses, mengubah, dan mengelola kumpulan data dalam satu variabel.
Selama 13 bab terakhir, setiap data yang kita simpan hanya menempati satu variabel: nama_peserta, skor, BATAS_LULUS. Ketika butuh menyimpan skor dari enam peserta kuis, kita harus membuat enam variabel terpisah — atau langsung menuliskan nilainya di dalam list literal seperti [62, 55, 78, 91, 45, 83] yang sudah pernah muncul di bab sebelumnya. Tapi kita belum pernah membahas apa sebenarnya list itu, bagaimana cara kerjanya, dan apa saja yang bisa dilakukan dengannya.
List adalah tipe data kolektif pertama yang akan kamu pelajari. Satu variabel, banyak nilai — terurut dan bisa diubah kapan saja. Kalau variabel biasa adalah kotak yang menyimpan satu benda, list adalah rak yang menyimpan banyak kotak sekaligus, dan setiap kotak punya nomor urut yang bisa kamu gunakan untuk mengambil isinya.
Membuat List
List dibuat dengan sepasang kurung siku [], dan setiap elemen dipisahkan koma.
# kuis.py — daftar peserta dan skor
peserta = ["Rina", "Budi", "Sari", "Dimas", "Lina"]
skor = [85, 72, 91, 68, 77]
print(peserta)
print(skor)
['Rina', 'Budi', 'Sari', 'Dimas', 'Lina']
[85, 72, 91, 68, 77]
List kosong juga valid — dan sering digunakan sebagai wadah yang diisi nanti:
# kuis.py
jawaban_salah = []
print(jawaban_salah)
print(len(jawaban_salah))
[]
0
Fungsi len() yang sudah kita kenal dari bab sebelumnya bekerja juga untuk list — ia mengembalikan jumlah elemen di dalamnya.
List Bisa Menyimpan Tipe Berbeda
Tidak seperti array di banyak bahasa lain, list Python tidak membatasi tipe data. Satu list bisa menyimpan string, integer, float, bahkan boolean sekaligus.
# kuis.py — profil peserta dalam satu list
profil_rina = ["Rina", 22, 85.5, True]
print(profil_rina)
['Rina', 22, 85.5, True]
Meski ini bisa dilakukan, dalam praktik nyata kita biasanya menyimpan data dengan tipe yang sama dalam satu list agar lebih mudah diolah. Profil seperti di atas lebih cocok menggunakan dictionary — yang akan kita bahas di bab-bab mendatang.
Mengakses Elemen List
Setiap elemen dalam list punya index — posisi urut yang dimulai dari 0, bukan 1. Elemen pertama ada di index 0, elemen kedua di index 1, dan seterusnya.
# kuis.py
peserta = ["Rina", "Budi", "Sari", "Dimas", "Lina"]
print(peserta[0]) # elemen pertama
print(peserta[2]) # elemen ketiga
print(peserta[4]) # elemen terakhir
Rina
Sari
Lina
Index Negatif
Python mendukung index negatif: -1 untuk elemen terakhir, -2 untuk elemen kedua dari belakang, dan seterusnya. Ini sangat berguna saat kamu tidak tahu (atau tidak peduli) berapa panjang list-nya.
# kuis.py
skor = [85, 72, 91, 68, 77]
print(skor[-1]) # elemen terakhir
print(skor[-2]) # satu sebelum terakhir
77
68
Mengakses index yang tidak ada — misalnya peserta[10] pada list yang hanya punya 5 elemen — akan menghasilkan IndexError. Selalu pastikan index yang kamu gunakan masih dalam jangkauan.
Mengubah Elemen List
List bersifat mutable — artinya isi list bisa diubah setelah dibuat. Cukup akses elemen lewat index-nya, lalu berikan nilai baru.
# kuis.py — koreksi skor Budi
skor = [85, 72, 91, 68, 77]
print(f"Skor Budi sebelum koreksi: {skor[1]}")
skor[1] = 76
print(f"Skor Budi setelah koreksi: {skor[1]}")
print(skor)
Skor Budi sebelum koreksi: 72
Skor Budi setelah koreksi: 76
[85, 76, 91, 68, 77]
Perubahan terjadi langsung di list yang sama — Python tidak membuat salinan baru. Ini penting untuk diingat, terutama nanti saat kita membahas bagaimana list berperilaku ketika di-pass ke fungsi.
Iterasi List dengan for
Menggabungkan list dengan for yang sudah kita pelajari di BAB 11 membuka kemampuan baru: memproses seluruh kumpulan data tanpa menulis kode berulang.
# kuis.py — cetak semua peserta dan skor mereka
peserta = ["Rina", "Budi", "Sari", "Dimas", "Lina"]
skor = [85, 76, 91, 68, 77]
for i in range(len(peserta)):
print(f"{peserta[i]}: {skor[i]}")
Rina: 85
Budi: 76
Sari: 91
Dimas: 68
Lina: 77
Pola range(len(list)) memberi kita index dari 0 sampai elemen terakhir, sehingga kita bisa mengakses dua list secara paralel menggunakan index yang sama.
Iterasi Langsung vs Index
Jika kamu hanya butuh nilai tanpa index, for bisa langsung mengiterasi elemen list:
# kuis.py — cetak skor di atas batas lulus
BATAS_LULUS = 70
for s in skor:
if s >= BATAS_LULUS:
print(f"Lulus: {s}")
Lulus: 85
Lulus: 76
Lulus: 91
Lulus: 77
Dan jika butuh keduanya — index dan nilai — enumerate() adalah pilihan paling idiomatis:
# kuis.py — cetak peringkat peserta
for urutan, nama in enumerate(peserta, start=1):
print(f"Peserta ke-{urutan}: {nama}")
Peserta ke-1: Rina
Peserta ke-2: Budi
Peserta ke-3: Sari
Peserta ke-4: Dimas
Peserta ke-5: Lina
Parameter start=1 membuat penomoran mulai dari 1 alih-alih 0 — cocok untuk tampilan yang lebih natural bagi pembaca manusia.
Menambah Elemen
List yang sudah dibuat bisa ditambah elemennya kapan saja. Tiga cara paling umum:
append() — Tambah di Akhir
# kuis.py — peserta baru bergabung
peserta = ["Rina", "Budi", "Sari"]
skor = [85, 76, 91]
peserta.append("Fajar")
skor.append(88)
print(peserta)
print(skor)
['Rina', 'Budi', 'Sari', 'Fajar']
[85, 76, 91, 88]
append() selalu menambahkan elemen di posisi paling akhir. Ini method yang paling sering dipakai karena biasanya kita memang ingin menambah data baru di urutan terakhir.
insert() — Tambah di Posisi Tertentu
# kuis.py — sisipkan peserta di urutan kedua
peserta = ["Rina", "Budi", "Sari"]
peserta.insert(1, "Dewi")
print(peserta)
['Rina', 'Dewi', 'Budi', 'Sari']
insert(index, nilai) menyisipkan elemen baru di posisi index, dan menggeser elemen-elemen setelahnya ke kanan. Perhatikan bahwa “Budi” yang tadinya di index 1 sekarang ada di index 2.
extend() — Gabungkan Dua List
# kuis.py — gabungkan peserta sesi pagi dan siang
sesi_pagi = ["Rina", "Budi"]
sesi_siang = ["Sari", "Dimas", "Lina"]
sesi_pagi.extend(sesi_siang)
print(sesi_pagi)
['Rina', 'Budi', 'Sari', 'Dimas', 'Lina']
extend() menambahkan semua elemen dari list lain ke list yang memanggil method ini. Hasilnya mirip dengan operator +, tapi extend() mengubah list yang sudah ada alih-alih membuat list baru.
# perbandingan: extend() vs operator +
a = [1, 2]
b = [3, 4]
# extend() mengubah list a secara langsung
a.extend(b)
print(a) # [1, 2, 3, 4]
# operator + membuat list baru
c = [1, 2]
d = [3, 4]
e = c + d
print(e) # [1, 2, 3, 4]
print(c) # [1, 2] — c tidak berubah
Menghapus Elemen
Menghapus elemen bisa dilakukan berdasarkan nilai atau berdasarkan index.
remove() — Hapus Berdasarkan Nilai
# kuis.py — peserta mengundurkan diri
peserta = ["Rina", "Budi", "Sari", "Dimas"]
peserta.remove("Budi")
print(peserta)
['Rina', 'Sari', 'Dimas']
remove() menghapus kemunculan pertama dari nilai yang diberikan. Jika nilai tidak ditemukan, Python melempar ValueError.
pop() — Hapus Berdasarkan Index
# kuis.py — hapus peserta terakhir yang mendaftar
peserta = ["Rina", "Budi", "Sari", "Dimas"]
peserta_keluar = peserta.pop()
print(f"{peserta_keluar} keluar dari kuis")
print(peserta)
Dimas keluar dari kuis
['Rina', 'Budi', 'Sari']
Tanpa argumen, pop() menghapus dan mengembalikan elemen terakhir. Kamu juga bisa memberikan index tertentu: peserta.pop(1) akan menghapus “Budi” dan mengembalikannya.
del — Hapus Elemen atau Rentang
# kuis.py
skor = [85, 76, 91, 68, 77]
del skor[1] # hapus elemen di index 1
print(skor)
del skor[1:3] # hapus elemen di index 1 sampai 2
print(skor)
[85, 91, 68, 77]
[85, 77]
del adalah statement (bukan method), dan bisa menghapus satu elemen atau beberapa sekaligus menggunakan notasi slice [start:end].
Memeriksa Keanggotaan
Operator in yang sudah muncul di bab-bab sebelumnya bekerja dengan list — dan ini cara paling pythonic untuk mengecek apakah sebuah nilai ada di dalam list.
# kuis.py — verifikasi peserta terdaftar
peserta = ["Rina", "Budi", "Sari", "Dimas", "Lina"]
nama = "Fajar"
if nama in peserta:
print(f"{nama} terdaftar sebagai peserta")
else:
print(f"{nama} tidak ditemukan dalam daftar peserta")
Fajar tidak ditemukan dalam daftar peserta
Untuk kebalikannya, gunakan not in:
if nama not in peserta:
print(f"{nama} belum terdaftar")
Mengurutkan dan Membalik
sort() — Urutkan di Tempat
# kuis.py — urutkan skor dari terendah ke tertinggi
skor = [85, 72, 91, 68, 77]
skor.sort()
print(skor)
[68, 72, 77, 85, 91]
Untuk urutan terbalik (tertinggi ke terendah), tambahkan parameter reverse=True:
skor.sort(reverse=True)
print(skor)
[91, 85, 77, 72, 68]
sort() mengubah list secara langsung dan mengembalikan None. Ini perbedaan penting: jangan tulis skor = skor.sort() karena hasilnya akan None.
reverse() — Balik Urutan
# kuis.py
peserta = ["Rina", "Budi", "Sari"]
peserta.reverse()
print(peserta)
['Sari', 'Budi', 'Rina']
reverse() membalik urutan list apa adanya — ini bukan sorting, hanya membalik posisi elemen dari depan ke belakang.
Jika kamu butuh list yang sudah diurutkan tapi tidak ingin mengubah list aslinya, gunakan fungsi bawaan sorted(). Ia mengembalikan list baru tanpa menyentuh list yang diberikan: skor_terurut = sorted(skor).
Menyalin List
Menyalin list di Python punya jebakan yang sering membuat pemula bingung. Perhatikan perbedaan berikut:
# kuis.py — referensi vs salinan
skor_asli = [85, 72, 91]
# ini BUKAN salinan — ini referensi ke list yang sama
skor_duplikat = skor_asli
skor_duplikat[0] = 100
print(skor_asli) # [100, 72, 91] — ikut berubah!
print(skor_duplikat) # [100, 72, 91]
Ketika kamu menulis skor_duplikat = skor_asli, Python tidak menyalin isi list. Kedua variabel menunjuk ke objek yang sama di memori. Mengubah satu berarti mengubah keduanya.
Untuk membuat salinan independen, gunakan copy() atau notasi slice [:]:
# kuis.py — salinan yang benar
skor_asli = [85, 72, 91]
skor_cadangan = skor_asli.copy()
skor_cadangan[0] = 100
print(skor_asli) # [85, 72, 91] — tidak berubah
print(skor_cadangan) # [100, 72, 91]
Dua cara ini menghasilkan shallow copy — salinan di level pertama. Untuk list yang berisi list lain (nested), kamu perlu copy.deepcopy() dari modul copy. Tapi untuk kebutuhan sehari-hari, copy() dan [:] sudah lebih dari cukup.
Konversi ke List
Fungsi list() bisa mengubah tipe data lain menjadi list, selama tipe tersebut iterable (bisa diiterasi).
# konversi range ke list
angka = list(range(1, 6))
print(angka)
# konversi string ke list karakter
huruf = list("KUIS")
print(huruf)
[1, 2, 3, 4, 5]
['K', 'U', 'I', 'S']
Konversi range() ke list sangat berguna saat kamu butuh list angka berurutan tanpa harus menulisnya satu per satu. Ingat range() dari BAB 11 — ia menghasilkan urutan angka yang lazy (tidak langsung disimpan di memori), dan list() memaksa semua nilai itu menjadi list nyata.
Nested List
List bisa menyimpan list lain sebagai elemennya — ini disebut nested list. Pola ini sangat berguna untuk merepresentasikan data tabular seperti tabel skor.
# kuis.py — skor tiap peserta untuk 3 soal
hasil_kuis = [
["Rina", 85, 90, 78],
["Budi", 76, 68, 82],
["Sari", 91, 95, 88],
["Dimas", 68, 72, 65],
]
# akses baris kedua (Budi)
print(hasil_kuis[1])
# akses skor soal ketiga milik Sari
print(hasil_kuis[2][3])
['Budi', 76, 68, 82]
88
Pola list[baris][kolom] memberikan akses langsung ke elemen spesifik di dalam nested list. Index pertama memilih baris (list luar), index kedua memilih kolom (elemen di dalam list dalam).
Untuk memproses semua data, gunakan loop bersarang:
# kuis.py — hitung rata-rata skor tiap peserta
for baris in hasil_kuis:
nama = baris[0]
skor_soal = baris[1:] # ambil semua elemen kecuali nama
rata_rata = sum(skor_soal) / len(skor_soal)
print(f"{nama}: rata-rata {rata_rata:.1f}")
Rina: rata-rata 84.3
Budi: rata-rata 75.3
Sari: rata-rata 91.3
Dimas: rata-rata 68.3
Di sini kita menggunakan baris[1:] untuk mengambil semua elemen mulai dari index 1 ke atas — ini adalah slicing, yang akan kita dalami secara lengkap di bab berikutnya.
Mencari dan Menghitung
Dua method yang sering berguna saat bekerja dengan list:
# kuis.py
skor = [85, 72, 91, 68, 77, 91, 85]
# cari posisi nilai pertama yang cocok
posisi = skor.index(91)
print(f"Skor 91 pertama kali muncul di index: {posisi}")
# hitung berapa kali nilai muncul
kemunculan = skor.count(85)
print(f"Skor 85 muncul sebanyak: {kemunculan} kali")
Skor 91 pertama kali muncul di index: 2
Skor 85 muncul sebanyak: 2 kali
index() mengembalikan posisi kemunculan pertama. Jika nilai tidak ada di list, Python melempar ValueError — jadi pastikan kamu mengecek dengan in terlebih dahulu jika tidak yakin nilainya ada.
Latihan
Tiga tantangan ini mengombinasikan list dengan konsep dari bab-bab sebelumnya:
-
Buat list berisi nama 5 peserta kuis. Minta pengguna memasukkan nama baru lewat
input(), lalu tambahkan ke list menggunakanappend(). Cetak list sebelum dan sesudah penambahan. Jika nama yang dimasukkan sudah ada di list (gunakanin), cetak pesan bahwa peserta sudah terdaftar dan jangan tambahkan. -
Kamu punya list
skor = [85, 72, 91, 68, 77, 45, 93, 58]. Gunakan loopforuntuk memisahkan skor ke dua list baru:lulus(skor >= 70) dantidak_lulus(skor < 70). Di akhir, cetak kedua list beserta jumlah elemennya masing-masing. -
Buat nested list yang berisi nama peserta dan 3 skor kuis mereka (minimal 4 peserta). Tulis program yang mencetak nama peserta dengan rata-rata tertinggi. Gunakan variabel untuk melacak rata-rata tertinggi dan nama pemiliknya — konsep pelacakan nilai yang mirip dengan yang kita pakai di bab
fordanwhile.
Dengan list, kita akhirnya punya cara menyimpan banyak data dalam satu wadah yang terorganisir. Tapi kamu mungkin sudah memperhatikan ekspresi seperti baris[1:] yang muncul di contoh nested list tadi — kita mengambil “potongan” dari sebuah list tanpa membahas secara detail bagaimana mekanismenya bekerja. Teknik itu disebut slicing. Dan di samping slicing, Python punya satu lagi cara membuat list yang jauh lebih ringkas dari pola loop-append yang sudah kita pakai berulang kali: list comprehension.