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