DataLens

List, indexing, dan slicing

Simpan banyak nilai dalam satu list berurutan, baca item berdasarkan posisinya, ambil potongan, dan ubah list dengan method-method-nya.

Level: Dasar · 11 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Idenya

Sejauh ini setiap variabel hanya berisi satu nilai. Tapi data datang berkelompok: semua produk dalam satu kategori, setiap pesanan hari ini, pendapatan tujuh hari terakhir. List menampung banyak nilai, secara berurutan, di bawah satu nama.

cities = ["Jakarta", "Bandung", "Surabaya"]
daily_orders = [12, 9, 15, 7, 11]
print(cities)
print(len(daily_orders))
['Jakarta', 'Bandung', 'Surabaya']
5

List ditulis dengan kurung siku, dengan item dipisahkan koma. len() memberi tahu berapa item yang dimilikinya. List bisa menampung tipe apa pun, bahkan campuran, tapi dalam praktiknya list yang baik berisi satu jenis hal: semuanya harga, atau semuanya nama.

Analogi

List adalah sederet loker bernomor. Setiap loker punya nomor (mulai dari 0) dan berisi satu barang. Kamu bisa membuka loker berdasarkan nomornya, menambah loker di ujung, atau mengeluarkan satu loker.

Indexing: mengambil satu item

Setiap item punya posisi, yaitu index-nya, mulai dari 0, persis seperti karakter dalam string:

cities = ["Jakarta", "Bandung", "Surabaya", "Medan"]
print(cities[0])
print(cities[2])
print(cities[-1])
print(cities[-2])
Jakarta
Surabaya
Medan
Surabaya

Index negatif menghitung dari belakang: -1 adalah item terakhir, -2 item kedua dari belakang. Minta index yang tidak ada dan Python berhenti:

print(cities[4])
IndexError: list index out of range

List berisi 4 item punya index 0 sampai 3. Kesalahan meleset satu (off-by-one) seperti ini adalah bug list yang klasik.

Slicing: mengambil rentang

Slice memberimu list baru berisi sebagian dari list asli, memakai aturan start:stop yang sama dengan yang kamu pelajari untuk string: dari start sampai, tapi tidak termasuk, stop.

revenue = [1693, 1957, 1517, 4227, 2552, 1680]   # ribuan Rupiah, Jan-Jun
print(revenue[0:3])    # kuartal pertama
print(revenue[3:])     # kuartal kedua
print(revenue[-2:])    # dua bulan terakhir
print(revenue[::2])    # setiap bulan kedua
[1693, 1957, 1517]
[4227, 2552, 1680]
[2552, 1680]
[1693, 1517, 2552]

Angka ketiga yang opsional adalah step (langkah): [::2] mengambil setiap item kedua. [::-1] adalah idiom praktis yang memberikan salinan terbalik.

List bisa berubah

Inilah perbedaan besar dengan string. Daftar stok hari ini bukan sesuatu yang dibuat sekali lalu dibiarkan: barang terjual, kiriman datang, ada salah ketik yang perlu dibetulkan. Jadi berbeda dengan string, list bersifat mutable, artinya kamu bisa mengubahnya di tempat tanpa membuat list baru. Untuk mengganti satu item, beri nilai ke index-nya:

stock = [24, 12, 80]
stock[1] = 15          # ganti sebuah item
print(stock)
[24, 15, 80]

Menambah dan menghapus item

List dilengkapi method untuk menambah dan menghapus. Berbeda dengan method string, sebagian besar method ini mengubah list itu sendiri dan mengembalikan None:

basket = ["Kopi Susu", "Roti Bakar"]
basket.append("Teh Tarik")          # tambah di akhir
basket.insert(0, "Air Mineral")     # tambah di posisi tertentu
print(basket)

basket.remove("Roti Bakar")         # hapus nilai pertama yang cocok
last = basket.pop()                 # hapus dan kembalikan item terakhir
print(basket, last)
['Air Mineral', 'Kopi Susu', 'Roti Bakar', 'Teh Tarik']
['Air Mineral', 'Kopi Susu'] Teh Tarik
MethodApa yang dilakukannya
.append(x)menambahkan x di akhir
.insert(i, x)menyisipkan x di index i
.extend(other)menambahkan setiap item dari list lain
.remove(x)menghapus item pertama yang sama dengan x (error kalau tidak ada)
.pop() / .pop(i)menghapus dan mengembalikan item terakhir, atau item di i
Awas

Karena .append() mengubah list dan mengembalikan None, menulis basket = basket.append("Teh") mengganti list-mu dengan None. Cukup panggil basket.append("Teh") di barisnya sendiri. Ini kebalikan dari method string, di mana kamu harus menyimpan hasilnya.

Mencari

Dengan list berisi rating pelanggan, kamu pasti ingin bertanya hal seperti "ada yang memberi kita 4.8?", "berapa orang?", dan "di mana yang pertama?". Ada alat untuk setiap pertanyaan itu:

ratings = [4.6, 4.5, 4.8, 4.3, 4.8]
print(4.8 in ratings)
print(ratings.count(4.8))
print(ratings.index(4.8))
True
2
2

in bertanya apakah sebuah nilai ada di list, .count() menghitungnya, dan .index() memberikan posisi kemunculan pertama-nya.

Mengurutkan

Ada dua cara mengurutkan, dan perbedaannya penting:

prices = [95000, 65000, 110000, 55000]
cheapest_first = sorted(prices)
print(cheapest_first)
print(prices)

prices.sort(reverse=True)
print(prices)
[55000, 65000, 95000, 110000]
[95000, 65000, 110000, 55000]
[110000, 95000, 65000, 55000]

Pakai sorted() kalau kamu masih butuh urutan aslinya, dan .sort() kalau tidak.

Fungsi bawaan praktis untuk list angka

List berisi angka, seperti jumlah pesanan per hari, biasanya ada supaya bisa diringkas: total seminggu, hari paling sepi, hari paling ramai, rata-ratanya. Fungsi bawaan Python menerima seluruh list dan langsung memberimu jawaban itu, tanpa perlu perulangan:

daily_orders = [12, 9, 15, 7, 11]
print(sum(daily_orders), min(daily_orders), max(daily_orders))
print(sum(daily_orders) / len(daily_orders))
54 7 15
10.8

sum(), min(), dan max() bekerja pada list angka apa pun, dan sum() / len() memberikan rata-ratanya.

List berisi list

Sebuah item bisa berupa list juga, yang memberimu tabel sederhana: list berisi baris-baris.

orders = [
    ["Ayu", "Jakarta", 285000],
    ["Budi", "Bandung", 960000],
]
print(orders[1])
print(orders[1][2])
['Budi', 'Bandung', 960000]
960000

orders[1] adalah baris kedua, dan orders[1][2] adalah item ketiga dari baris itu. Ini bisa jalan, tapi begitu kamu butuh field bernama, dictionary (segera dibahas) atau DataFrame pandas jauh lebih jelas daripada mengingat bahwa index 2 berarti "total".

Menyalin list

Memberikan list ke nama baru tidak menyalinnya. Kedua nama menunjuk ke list yang sama:

original = [1, 2, 3]
alias = original
alias.append(4)
print(original)

copy = original.copy()
copy.append(5)
print(original, copy)
[1, 2, 3, 4]
[1, 2, 3, 4] [1, 2, 3, 4, 5]

Kalau kamu ingin list yang terpisah, pakai .copy() (atau slice penuh, original[:]).

Mengapa ini penting untuk kode bersih

Beri nama list dalam bentuk jamak (cities, prices, orders) supaya cities[0] terbaca sebagai "kota pertama". Simpan satu jenis hal per list. Dan ketahui operasi mana yang mengubah list dan mana yang membuat list baru: sebagian besar bug list berasal dari mengubah list yang kamu kira salinan, atau dari menyimpan None yang dikembalikan method in-place.

Rangkuman

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Tuple dan kapan memakainya →