collections.defaultdict

Słownik, który dla brakującego klucza sam tworzy wartość domyślną, np. pustą listę lub zero.

Zwraca
Obiekt defaultdict, czyli słownik z automatycznymi wartościami domyślnymi.
Na tej stronie

Przykład

#
Python
from collections import defaultdict

topics = [("HTML", "znaczniki"), ("CSS", "flexbox"), ("HTML", "formularze")]

by_course = defaultdict(list)
for course, topic in topics:
    by_course[course].append(topic)

print(by_course["HTML"])
print(dict(by_course))
Wynikzapisany wynik, możesz go sprawdzić
['znaczniki', 'formularze']
{'HTML': ['znaczniki', 'formularze'], 'CSS': ['flexbox']}

Definicja i zastosowanie

#

Klasa defaultdict z modułu collections działa jak zwykły słownik, ale przy odczycie brakującego klucza nie zgłasza KeyError. Zamiast tego wywołuje funkcję podaną przy tworzeniu, zapisuje jej wynik pod tym kluczem i go zwraca.

Funkcję podaje się bez nawiasów: defaultdict(list) tworzy dla nowych kluczy pustą listę, defaultdict(int) zero, a defaultdict(set) pusty zbiór. Możesz też podać własną funkcję, np. defaultdict(lambda: "brak").

Najczęstsze zastosowania to grupowanie (groups[key].append(item)) i sumowanie (totals[key] += value) bez sprawdzania, czy klucz już istnieje. Pamiętaj, że sam odczyt d[klucz] też dodaje brakujący klucz. Metoda get() i operator in tego nie robią.

Składnia

#
Składnia
from collections import defaultdict

defaultdict(default_factory)
defaultdict(list)
defaultdict(int)

Parametry

#
  • default_factory

    funkcja bez argumentów lub None

    Tworzy wartość dla brakującego klucza, np. list daje [], a int daje 0. Przy None słownik zachowuje się jak zwykły dict.

Więcej przykładów

#
Sumowanie z int
Python
from collections import defaultdict

points = defaultdict(int)
for name, exp in [("Ania", 20), ("Kuba", 15), ("Ania", 10)]:
    points[name] += exp

print(points)
print(points["Ola"])
Wynikzapisany wynik, możesz go sprawdzić
defaultdict(<class 'int'>, {'Ania': 30, 'Kuba': 15})
0
Pułapka: odczyt też tworzy klucz
Python
from collections import defaultdict

scores = defaultdict(list)
print(scores["Ola"])
print("Ola" in scores, len(scores))

print(scores.get("Iga"), len(scores))
Wynikzapisany wynik, możesz go sprawdzić
[]
True 1
None 1

Dobre praktyki

#
  • Do sprawdzania, czy klucz istnieje, używaj in albo get(). Odczyt przez nawiasy kwadratowe doda brakujący klucz.
  • Zanim przekażesz wynik dalej, zamień go na zwykły słownik przez dict(). Czytelniej się wypisuje, a przypadkowy odczyt brakującego klucza nie doda już nowego wpisu.
  • Do samego zliczania elementów jeszcze wygodniejszy jest Counter.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.