DefaultDict vs dict (BiteSize) – grupowanie danych

Dziś w BiteSize – jaka jest różnica między zwykłym dict, a defaultdict? Jak wykorzystać defaultdict do grupowania danych? Wykorzystamy bibliotekę collections z jednej z wielu bibliotek standardowych Python. Najważniejsze informacje w krótkiej i zwięzłej formie, akurat do schrupania na raz, czyli BiteSize!

Problem do rozwiązania

Zadanie polega na pogrupowaniu danych, w tym przypadku będzie to lista krotek zawierająca imię i szkolną ocenę z biologi. Dane chcemy zapisać w słowniku. Każda osoba może mieć wiele ocen oraz nie wiemy, jak długa jest lista. O wszystkim dowiadujemy się iterując po elementach 🙂

grades_info = [
    ("Marek", 4),
    ("Zosia", 5),
    ("Kasia", 6),
    ("Grzesiek", 3),
    ("Zosia", 4),
    ("Grzesiek", 4),
    ("Zosia", 4),
    ("Marek", 3.5),
    ...
]

Standardowe rozwiązanie

Myślę, że problem nie jest trudny i wszyscy zrobiliby to tak samo. Czyli iterujemy po liście krotek, sprawdzamy, czy dana osoba jest wpisana do słownika, jeżeli nie to tworzymy dla niej pustą listę, a następnie dodajemy ocenę.

students_grades = {}
for name, grade in grades_info:

    if name not in students_grades:
        students_grades[name] = []

    students_grades[name].append(grade)

Oczywiście można by zaimplementować to inaczej, ale zapisałem to w taki sposób, abyś zauważył/a różnicę, w momencie gdy użyjemy defaultdict.

Implementacja wykorzystująca defaultdict

Należy pamiętać, aby zaimportować defaultdict z biblioteki standardowej collections. A kod z wykorzystaniem nowego narzędzia zapiszemy następująco.

from collections import defaultdict

students_grades = defaultdict(list)

for name, grade in grades_info:
    students_grades[name].append(grade)

Pewnie zauważyłeś / zauważyłaś, że brakuje warunku sprawdzającego, czy klucz istnieje już w słowniku. Na tym polega przewaga defaultdict ponad normalnym słownikiem. W linii 3 deklarujemy defaultdict z domyślnym typem danych, w tym przypadku listą.

W przypadku z normalnym słownikiem, odwołując się do klucza, którego nie ma, uzyskamy KeyError. Natomiast defaultdict, w przypadku gdy nie ma klucza, ustawia nam pustą listę jako domyślną wartość.

Podsumowanie i wnioski

Po pierwsze słowniki są super. Po drugie defaultdict jest super! Istnieje wiele zastosowań defaultdict, w tym wpisie skupiłem się na wykorzystaniu listy, jak się pewnie domyślasz, możemy wykorzystać także inne typy zmiennych, ale o tym w innym wpisach.

Więcej info o defaultdict w dokumentacji Python pod linkiem.

Potrafię się rozgadywać i rozpisywać, więc starałem się streszczać. Daj znać czy takie krótkie wpisy są dobre, czy wolisz więcej wytłumaczenia.

Interesuje Cię jakiś konkretny temat? – Napisz! Tematy z największym interesowaniem pójdą na pierwszy plan 🙂 Inne wpisy z segmentu BiteSize znajdziesz tu.
~ Marek

Scroll to Top