List adalah daftar nilai yang berurutan, disimpan dalam satu variabel. Bayangin tali jepitan nota di dapur Warung Kopi Pak Darto. Tiap pesanan ditulis di kertas, lalu dijepit berjajar di tali itu. Jepitan paling kiri nomor 0, sebelahnya nomor 1, dan seterusnya. Pak Darto bisa menjepit nota baru di ujung, mencabut nota terakhir, atau menyusun ulang urutannya. Talinya tetap satu, isinya yang berubah. Beda dengan papan menu di pelajaran string, yang ubinnya ditempel mati.
🧪 Tebakan cepat:
a = ["kopi susu", "teh manis"], lalub = a, lalua.append("roti bakar"), laluprint(b). Yang tercetak 2 item atau 3 item? Tebak dulu, jawabannya ada di bagian "Dua nama, satu list".
Membuat list
pesanan = ["kopi susu", "teh manis", "roti bakar"]
harga = [15000, 5000, 12000]
kosong = []
print(pesanan) # ['kopi susu', 'teh manis', 'roti bakar']
print(len(pesanan)) # 3
print("teh manis" in pesanan) # True
- List ditulis dengan kurung siku
[ ], isinya dipisah koma. Tiap isi disebut item. - Isinya boleh tipe apa saja: teks, angka, bahkan campuran. Biasanya satu list berisi satu jenis data.
printmenulis list dengan kurung siku dan kutip tunggal, walaupun di kode kamu menulis kutip ganda.len(pesanan)menghitung jumlah item: 3."teh manis" in pesananmengecek apakah item itu ada di list:TrueatauFalse.
Indeks dan indeks negatif
Sama seperti karakter di string, tiap item punya nomor posisi, disebut indeks:
| Item | kopi susu |
teh manis |
roti bakar |
|---|---|---|---|
| Indeks | 0 | 1 | 2 |
| Indeks negatif | -3 | -2 | -1 |
pesanan[0]adalahkopi susu. Indeks mulai dari 0, jadi item terakhir ada dilen(pesanan) - 1, yaitu 2.- Indeks negatif menghitung dari belakang:
pesanan[-1]adalahroti bakar,pesanan[-2]adalahteh manis. Di listangka = [10, 20, 30, 40, 50],angka[-2]adalah40, item kedua dari belakang. - Indeks yang gak ada ditolak:
Traceback (most recent call last):
File "/home/darto/warung.py", line 2, in <module>
print(pesanan[3])
~~~~~~~^^^
IndexError: list index out of range
Tanda ~~~~~~~ menunjuk list-nya, ^^^ menunjuk indeks yang salah. List ini cuma punya indeks 0 sampai 2 (atau -1 sampai -3), jadi pesanan[3] dan pesanan[-4] sama-sama IndexError.
Mengubah isi list
List itu mutable: isinya bisa diubah tanpa membuat list baru. Ganti satu item lewat indeksnya, pesanan[1] = "es teh", dan list-nya langsung jadi ['kopi susu', 'es teh', 'roti bakar']. Selain itu ada method-method ini:
pesanan = ["kopi susu", "teh manis", "roti bakar"]
pesanan.append("es jeruk") # tambah di ujung
pesanan.insert(0, "air putih") # sisipkan di indeks 0
pesanan.pop() # cabut item terakhir
pesanan.remove("teh manis") # buang berdasarkan isinya
print(pesanan) # ['air putih', 'kopi susu', 'roti bakar']
| Baris | Isi pesanan sesudahnya |
|---|---|
append("es jeruk") |
['kopi susu', 'teh manis', 'roti bakar', 'es jeruk'] |
insert(0, "air putih") |
['air putih', 'kopi susu', 'teh manis', 'roti bakar', 'es jeruk'] |
pop() |
['air putih', 'kopi susu', 'teh manis', 'roti bakar'] |
remove("teh manis") |
['air putih', 'kopi susu', 'roti bakar'] |
.append(x)menambah satu item di ujung kanan..insert(i, x)menyisipkan di indeksi, item lain bergeser ke kanan..pop()mencabut item terakhir dan memberikannya ke kamu:x = pesanan.pop()..pop(0)mencabut yang pertama..remove(x)membuang item pertama yang isinyax.
Untuk mengurutkan ada dua cara:
harga = [15000, 5000, 12000]
print(sorted(harga)) # [5000, 12000, 15000]
print(harga) # [15000, 5000, 12000], gak berubah
harga.sort()
print(harga) # [5000, 12000, 15000]
sorted(harga)membuat list baru yang urut. List aslinya tetap.harga.sort()mengurutkan list itu sendiri. Teks diurutkan menurut abjad:apple,banana,bonus,cherry.- Method yang mengubah list (
append,insert,remove,sort) gak mengembalikan list. HasilnyaNone, nilai kosong dari pelajaran variabel.
Slicing: memotong list
pesanan = ["kopi susu", "teh manis", "roti bakar", "es jeruk", "air putih"]
print(pesanan[:3]) # ['kopi susu', 'teh manis', 'roti bakar']
print(pesanan[1:3]) # ['teh manis', 'roti bakar']
print(pesanan[-2:]) # ['es jeruk', 'air putih']
print(pesanan[::2]) # ['kopi susu', 'roti bakar', 'air putih']
print(pesanan[::-1]) # ['air putih', 'es jeruk', 'roti bakar', 'teh manis', 'kopi susu']
- Bentuk lengkapnya
list[awal:akhir:langkah]. Berhenti sebelumakhir, persis seperti slicing string. data[:3]sama dengandata[0:3]: tiga item pertama, indeks 0, 1, 2. Didata = [1, 2, 3, 4, 5]hasilnya[1, 2, 3].[::2]mengambil selang satu: indeks 0, 2, 4.[::-1]membalik urutannya.- Hasil slicing selalu list baru. List aslinya gak ikut terpotong, dan slicing gak pernah
IndexError.
Dua nama, satu list
Ingat pelajaran variabel: nama itu label yang ditempel ke nilai. b = a gak menyalin list, tapi menempel label kedua ke list yang sama:
a = ["kopi susu", "teh manis"]
b = a
a.append("roti bakar")
print(b) # ['kopi susu', 'teh manis', 'roti bakar']
a dan b itu satu tali jepitan dengan dua label. Jepit nota lewat a, dan b ikut melihatnya. Jadi yang tercetak 3 item. Itu jawaban tebakannya.
Mau salinan yang terpisah? Pakai .copy() atau slicing penuh a[:]:
a = ["kopi susu", "teh manis"]
b = a.copy()
a.append("roti bakar")
print(a) # ['kopi susu', 'teh manis', 'roti bakar']
print(b) # ['kopi susu', 'teh manis']
Hal yang sama terjadi saat list dikirim ke fungsi: parameternya cuma label lain untuk list yang sama. Kalau fungsi memanggil items.append("bonus"), list milik pemanggilnya ikut bertambah.
⚠️ Jebakan yang sering ketemu
- Menyimpan hasil
.sort().pesanan = pesanan.sort()membuatpesananjadiNone, dan baris berikutnya gagal:TypeError: 'NoneType' object is not subscriptable. Panggilpesanan.sort()sendirian, atau pakaiurut = sorted(pesanan). - Indeks terakhir dikira sama dengan
len. List 3 item cuma sampai indeks 2.pesanan[len(pesanan)]adalahIndexError: list index out of range. Item terakhir:pesanan[-1]. b = adikira salinan. Itu dua label untuk satu list. Salin dengana.copy()ataua[:].- Membuang item yang gak ada.
pesanan.remove("es jeruk")saates jerukgak ada di list:ValueError: list.remove(x): x not in list. Cek dulu denganif "es jeruk" in pesanan:.
TL;DR: List adalah daftar berurutan di dalam [ ], len() menghitung itemnya, dan in mengecek isinya. Indeks mulai dari 0, indeks negatif dari belakang (angka[-2] item kedua dari belakang), dan indeks di luar batas jadi IndexError: list index out of range. List mutable: .append(x) menambah di ujung, .insert(i, x) menyisipkan, .pop() mencabut yang terakhir, .remove(x) membuang berdasarkan isi, .sort() mengurutkan di tempat dan mengembalikan None, sedangkan sorted() membuat list baru. Slicing [awal:akhir:langkah] berhenti sebelum akhir dan selalu membuat list baru: data[:3] adalah tiga item pertama. b = a menempel label kedua ke list yang sama, jadi salin dengan .copy() atau [:].