Lompati ke konten utama
Modul 8 · Pelajaran 3 dari 431/36 dalam kursus~12 min
Pelajaran modul (3/4)

koleksi: Penghitung dan defaultdict

Modul collections menambahkan tipe data khusus yang memperluas koleksi bawaan. Tiga yang paling banyak digunakan: Counter, defaultdict, namedtuple.

Counter: penghitungan frekuensi

Python
from collections import Counter

parole = ["mela", "pera", "mela", "kiwi", "mela", "pera"]
c = Counter(parole)
# Counter({'mela': 3, 'pera': 2, 'kiwi': 1})

c["mela"]            # 3
c["banana"]          # 0   (default for missing keys, NO KeyError)
c.most_common(2)     # [('mela', 3), ('pera', 2)]

Ini juga berfungsi pada string (menghitung karakter):

Python
Counter("ciao mondo")
# Counter({'o': 2, 'c': 1, 'i': 1, 'a': 1, ' ': 1, 'm': 1, 'n': 1, 'd': 1})

Ini mendukung operasi seperti himpunan pada hitungan (+, -, &, |) — sangat berguna untuk mengumpulkan jumlah dari berbagai sumber.

defaultdict: dikt dengan default otomatis

Sebuah dikte yang, ketika Anda mengakses kunci yang hilang, membuatnya dengan memanggil a pabrik.

Python
from collections import defaultdict

gruppi = defaultdict(list)        # factory = list (empty list)
for nome in ["Ada", "Linus", "Ada", "Grace"]:
    gruppi[nome].append(1)
# defaultdict(list, {'Ada': [1, 1], 'Linus': [1], 'Grace': [1]})

Tanpa defaultdict, Anda harus menulis:

Python
gruppi = {}
for nome in [...]:
    if nome not in gruppi:
        gruppi[nome] = []
    gruppi[nome].append(1)

Pabrik umum: list, int (default 0), set, dict.

namedtuple: tupel dengan nama field

Cara ringan untuk membuat kelas rekaman yang tidak dapat diubah. Ini adalah tuple, tapi dengan akses lapangan berdasarkan nama.

Python
from collections import namedtuple

Punto = namedtuple("Punto", ["x", "y"])
p = Punto(3, 4)
p.x          # 3 (access by name)
p[0]         # 3 (access by index, still a tuple)
p.x + p.y    # 7

# typical use: return multiple values from a function
def divisione(a, b):
    Risultato = namedtuple("Risultato", ["quoziente", "resto"])
    return Risultato(a // b, a % b)

r = divisione(17, 5)
r.quoziente   # 3
r.resto       # 2

(Untuk kasus yang lebih canggih juga ada dataclasses sejak 3.7 — lihat M9.)

nametuple: catatan ringan yang tidak dapat diubah

Modul collections juga mengekspor namedtuple, yang memungkinkan Anda dengan cepat membuat objek ringan seperti kelas untuk menyimpan data terstruktur tanpa menulis konstruktor atau metode boilerplate:

Python
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)

Cobalah

Latihan#python.m8.l3.e1
Upaya: 0Memuat…

Mengingat daftar `kata = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']`, hitung kata yang paling sering muncul di `top` sebagai string. Evaluasi `atas`.

Memuat editor…
Tunjukkan petunjuk

Counter(...).most_common(1) mengembalikan [(kata, hitungan)].

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#python.m8.l3.e2
Upaya: 0Memuat…

Mengingat siswa `pendaftaran = [('Ada', 'mate'), ('Linus', 'fisica'), ('Ada', 'storia'), ('Grace', 'mate')]`, buat `courses_per_student` sebagai defaultdict(daftar). Evaluasi `dict(kursus_per_siswa)`.

Memuat editor…
Tunjukkan petunjuk

defaultdict(daftar) lalu untuk s, c dalam pendaftaran.

Solusi tersedia setelah 3 upaya

Tantangan tambahan

Latihan#python.m8.l3.e3
Upaya: 0Memuat…

Impor \`Penghitung\` dari \`koleksi\`. Hitung frekuensi karakter dalam string \`text = "abracadabra"\`. Simpan penghitung di \`char_counter\` dan evaluasi.

Memuat editor…
Tunjukkan petunjuk

Counter mengambil string sebagai parameter dan menghitung kemunculan setiap huruf.

Solusi tersedia setelah 3 upaya