22. List — Solusi Pekerjaan Rumah

File solusi .py ada di exercises/22/homework/solutions/.

Soal 1 — Game favorit

Soal. Cetak list bernomor menggunakan enumerate.

Cara berpikir. enumerate(games, 1) memberikan indeks (mulai dari 1) dan nilainya. Bangun setiap baris dari indeks, titik, spasi, dan nilainya.

Solusi.

games = ["Roblox", "Minecraft", "Terraria", "Stardew Valley", "Hades"]

for i, name in enumerate(games, 1):
    print(f"{i}. {name}")

Output:

1. Roblox
2. Minecraft
3. Terraria
4. Stardew Valley
5. Hades

Kesalahan umum.

  • Mengindeks dari 0 sehingga mendapat 0. Roblox. Berikan 1 sebagai argumen kedua enumerate untuk memulai penomoran dari 1.
  • Menggunakan range(len(games)) lalu games[i]. Itu bekerja, tapi enumerate lebih langsung dan mudah dibaca.

Soal 2 — Jumlahkan list

Soal. Tambahkan setiap angka dalam list; cetak totalnya.

Cara berpikir. Simpan total yang berjalan, diperbarui dengan total = total + value di dalam loop. Kamu juga bisa menggunakan bawaan sum(scores) untuk satu baris.

Solusi.

scores = [12, 7, 24, 9, 30]

total = 0
for value in scores:
    total = total + value

print(f"Total: {total}")

Atau bentuk singkatnya:

scores = [12, 7, 24, 9, 30]
print(f"Total: {sum(scores)}")

Kesalahan umum.

  • Lupa total = 0 sebelum loop. None + 12 adalah error.

Soal 3 — Sisipkan dan hapus

Soal. Lakukan empat operasi list, cetak list setelah masing-masing.

Cara berpikir. Tulis helper pencetakan kecil satu kali dan panggil setelah setiap langkah. Lalu operasinya menjadi satu baris masing-masing.

Solusi.

lst = ["apple", "banana", "cherry"]

def show(label):
    print(f"{label}: {', '.join(lst)}")

show("Start          ")
lst.append("date")
show("After append   ")
lst.insert(0, "apricot")
show("After insert@0 ")
lst.pop()
show("After pop      ")
lst.pop(1)
show("After pop@1    ")

Output:

Start          : apple, banana, cherry
After append   : apple, banana, cherry, date
After insert@0 : apricot, apple, banana, cherry, date
After pop      : apricot, apple, banana, cherry
After pop@1    : apricot, banana, cherry

Kesalahan umum.

  • Menggunakan lst[1] = None alih-alih lst.pop(1). Itu meninggalkan None di list alih-alih menghapus slot-nya.
  • Bingung dengan posisi berbasis 0: insert(0, ...) menyisipkan di awal sekali; insert(1, ...) menyisipkan sebelum posisi 1 (item kedua).

Tantangan — Balik list

Soal. reverse(lst) mengembalikan list baru, aslinya tidak berubah.

Cara berpikir. Bangun list baru di dalam function. Telusuri aslinya dari belakang ke depan — baik dengan range yang dibalik atau dengan slice — tambahkan setiap nilai ke list baru, dan kembalikan.

Solusi.

def reverse(lst):
    result = []
    for i in range(len(lst) - 1, -1, -1):
        result.append(lst[i])
    return result

fruits = ["apple", "banana", "cherry"]
print(", ".join(fruits))            # apple, banana, cherry

reversed_fruits = reverse(fruits)
print(", ".join(reversed_fruits))   # cherry, banana, apple
print(", ".join(fruits))            # apple, banana, cherry (unchanged)

Python juga punya lst[::-1] (slice yang dibalik) dan list(reversed(lst)) sebagai cara bawaan untuk membalik. Begitu kamu tahu itu ada, gunakanlah; loop manual di atas untuk memahami mekanismenya.

Kesalahan umum.

  • Memodifikasi lst di tempat alih-alih membangun list baru. Soal meminta aslinya tetap tidak berubah.
  • Off-by-one pada range: range(len(lst) - 1, -1, -1) dimulai dari indeks valid terakhir dan berhenti tepat sebelum -1 (yaitu di 0).

Selesai?

Bab berikutnya mengajarkan dictionary — struktur data yang memetakan nama ke nilai, seperti tabel pencarian.