Ana içeriğe geç
Modül 8 · Ders 3 ders 4Kurstaki 31/36~12 min
Modül dersleri (3/4)

koleksiyonlar: Counter ve defaultdict

collections modülü, kapsamı genişleten özel veri türleri ekler. yerleşik koleksiyonlar. En çok kullanılan üç tanesi: Counter, defaultdict, namedtuple.

Counter: frekans sayımı

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)]

Ayrıca dizeler üzerinde de çalışır (karakterleri sayar):

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

Sayımlarda (+, -, &, |) küme benzeri işlemleri destekler - çok kullanışlı Farklı kaynaklardan gelen sayımları toplamak için.

defaultdict: otomatik varsayılanla dikte et

Eksik bir anahtara eriştiğinizde onu çağırarak oluşturan bir deyim fabrika.

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]})

defaultdict olmasaydı şunu yazmanız gerekirdi:

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

Ortak fabrikalar: list, int (varsayılan 0), set, dict.

namedtuple: alan adlarına sahip tanımlama grupları

Değişmez kayıt sınıfları oluşturmanın hafif bir yolu. Bu bir tuple ama isme göre alan erişimi ile.

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

(Daha karmaşık durumlar için 3.7'den beri dataclasses de vardır — bkz. M9.)

Namedtuple: hafif, değişmez kayıtlar

collections modülü aynı zamanda namedtuple dosyasını da dışa aktarır; bu, yapıcılar veya standart yöntemler yazmadan yapılandırılmış verileri depolamak için hızlı bir şekilde hafif sınıf benzeri nesneler oluşturmanıza olanak tanır:

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

Deneyin

Egzersiz#python.m8.l3.e1
Denemeler: 0Yükleniyor…

`words = ['mela', 'pera', 'mela', 'kiwi', 'mela', 'pera']` listesi verildiğinde, `top`ta en sık geçen kelimeyi bir dize olarak hesaplayın. 'Üst'ü değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

Counter(...).most_common(1), [(word, count)] değerini döndürür.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#python.m8.l3.e2
Denemeler: 0Yükleniyor…

Öğrencilerin `kayıtları = [('Ada', 'mate'), ('Linus', 'fisica'), ('Ada', 'storia'), ('Grace', 'mate')]` göz önüne alındığında, varsayılan bir liste (liste) olarak `courses_per_student'i oluşturun. `dict(courses_per_student)`'i değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

defaultdict(list) sonra kayıtlarda s, c için.

3 denemeden sonra çözüm mevcut

Ek zorluk

Egzersiz#python.m8.l3.e3
Denemeler: 0Yükleniyor…

\`Sayacı\`nı \`koleksiyonlardan\` içe aktarın. \`text = "abracadabra"\` dizesindeki karakterlerin sıklığını sayın. Sayacı \`char_counter\`'da saklayın ve değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

Counter, dizeyi parametre olarak alır ve her harfin oluşumlarını sayar.

3 denemeden sonra çözüm mevcut