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
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):
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.
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:
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.
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:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y)Cobalah
Mengingat daftar `kata = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']`, hitung kata yang paling sering muncul di `top` sebagai string. Evaluasi `atas`.
Tunjukkan petunjuk
Counter(...).most_common(1) mengembalikan [(kata, hitungan)].
Solusi tersedia setelah 3 upaya
Tinjau latihan
Mengingat siswa `pendaftaran = [('Ada', 'mate'), ('Linus', 'fisica'), ('Ada', 'storia'), ('Grace', 'mate')]`, buat `courses_per_student` sebagai defaultdict(daftar). Evaluasi `dict(kursus_per_siswa)`.
Tunjukkan petunjuk
defaultdict(daftar) lalu untuk s, c dalam pendaftaran.
Solusi tersedia setelah 3 upaya
Tantangan tambahan
Impor \`Penghitung\` dari \`koleksi\`. Hitung frekuensi karakter dalam string \`text = "abracadabra"\`. Simpan penghitung di \`char_counter\` dan evaluasi.
Tunjukkan petunjuk
Counter mengambil string sebagai parameter dan menghitung kemunculan setiap huruf.
Solusi tersedia setelah 3 upaya