Przeczytałem przykłady w dokumentach Pythona, ale wciąż nie mogę zrozumieć, co oznacza ta metoda. Czy ktoś może pomóc? Oto dwa przykłady z dokumentacji Pythona
>>> from collections import defaultdict
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
i
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
... d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
parametry int
i list
po co?
python
dictionary
default-value
defaultdict
Lanston
źródło
źródło
default_factory = None
po zakończeniu wypełniania domyślnego dykta. Zobacz to pytanie .Odpowiedzi:
Zwykle słownik Pythona rzuca,
KeyError
jeśli próbujesz uzyskać element z kluczem, którego nie ma obecnie w słowniku. Wdefaultdict
przeciwieństwie do tego po prostu utworzy wszystkie przedmioty, do których próbujesz uzyskać dostęp (oczywiście pod warunkiem, że jeszcze nie istnieją). Aby utworzyć taki „domyślny” element, wywołuje on obiekt funkcji, który przekazujesz do konstruktora (a ściślej, jest to dowolny obiekt „na żądanie”, który obejmuje obiekty funkcji i typu). W pierwszym przykładzie elementy domyślne są tworzone przy użyciuint()
, który zwraca obiekt liczby całkowitej0
. W drugim przykładzie elementy domyślne są tworzone przy użyciulist()
, który zwraca nowy pusty obiekt listy.źródło
d.get(key, default)
nigdy nie zmodyfikuje Twojego słownika - po prostu zwróci domyślny i pozostawi słownik bez zmian.defaultdict
z drugiej strony wstawi klucz do słownika, jeśli jeszcze go nie ma. To duża różnica; zobacz przykłady w pytaniu, aby zrozumieć, dlaczego.defaultdict
wywołuje dowolny przekazany konstruktor. Jeśli podasz typT
, wartości zostaną zbudowane przy użyciuT()
. Nie wszystkie typy można konstruować bez przekazywania jakichkolwiek parametrów. Jeśli chcesz zbudować taki typ, potrzebujesz funkcji otoki lub czegoś podobnegofunctools.partial(T, arg1, arg2)
.defaultdict
oznacza, że jeśli klucz nie zostanie znaleziony w słowniku, zamiastKeyError
zostać wyrzuconym, tworzony jest nowy wpis. Typ tego nowego wpisu podaje argument defaultdict.Na przykład:
źródło
0
liczbę całkowitą, jeśli tak,someddict = defaultdict(list)
to zwraca[ ]
. Czy 0 jest domyślną liczbą całkowitą? Lub [] domyślna lista?0
jest niezmienny - w CPython wszystkie wartości od-5
do256
są buforowanymi singletonami, ale jest to zachowanie specyficzne dla implementacji - w obu przypadkach nowa instancja jest „tworzona” za każdym razem za pomocąint()
lublist()
. W ten sposóbd[k].append(v)
może działać bez wypełniania słownika odniesieniami do tej samej listy, co uczyniłoby godefaultdict
prawie bezużytecznym. Gdyby takie było zachowanie,defaultdict
wziąłby jako parametr wartość, a nie lambda. (Przepraszam za okropne wyjaśnienie!)defaultdict
„Słownik standardowy zawiera metodę setdefault () służącą do pobierania wartości i ustanawiania wartości domyślnej, jeśli wartość nie istnieje. Natomiast
defaultdict
program wywołujący może określić wartość domyślną (wartość do zwrócenia) z góry podczas inicjowania kontenera.”jak zdefiniował Doug Hellmann w The Standard Python Library przez przykład
Jak korzystać z defaultdict
Importuj defaultdict
Zainicjuj defaultdict
Zainicjuj go, przechodząc
lub
Jak to działa
Ponieważ jest klasą potomną standardowego słownika, może wykonywać te same funkcje.
Ale w przypadku przekazania nieznanego klucza zwraca wartość domyślną zamiast błędu. Na przykład:
W przypadku, gdy chcesz zmienić wartość domyślną, nadpisz default_factory:
lub
Przykłady w pytaniu
Przykład 1
Ponieważ int został przekazany jako default_factory, każdy nieznany klucz domyślnie zwróci 0.
Teraz, gdy ciąg zostanie przekazany w pętli, zwiększy liczbę tych alfabetów w d.
Przykład 2
Ponieważ lista została przekazana jako default_factory, każdy nieznany (nieistniejący) klucz domyślnie zwróci [] (tj. Listę).
Teraz, gdy lista krotek jest przekazywana w pętli, dołączy wartość w d [kolor]
źródło
Słowniki to wygodny sposób przechowywania danych do późniejszego pobrania według nazwy (klucza). Klucze muszą być unikalnymi, niezmiennymi obiektami i zazwyczaj są łańcuchami. Wartości w słowniku mogą być dowolne. W wielu aplikacjach wartościami są proste typy, takie jak liczby całkowite i łańcuchy.
Staje się bardziej interesujący, gdy wartościami w słowniku są kolekcje (listy, dykta itp.). W takim przypadku wartość (pusta lista lub dykta) musi zostać zainicjowana przy pierwszym użyciu danego klucza. Chociaż jest to stosunkowo łatwe do zrobienia ręcznie, typ defaultdict automatyzuje i upraszcza tego rodzaju operacje. Domyślny dykta działa dokładnie tak jak normalny dykt, ale jest inicjowany funkcją („domyślną fabryką”), która nie przyjmuje żadnych argumentów i podaje wartość domyślną dla nieistniejącego klucza.
Defaultdict nigdy nie zgłosi KeyError. Każdy nieistniejący klucz otrzymuje wartość zwracaną przez domyślną fabrykę.
Oto kolejny przykład dotyczący tego, jak za pomocą defaultdict możemy zmniejszyć złożoność
Podsumowując, ilekroć potrzebujesz słownika, a wartość każdego elementu powinna zaczynać się od wartości domyślnej, użyj defaultdict.
źródło
Świetne wyjaśnienie defaultdicts tutaj: http://ludovf.net/blog/python-collections-defaultdict/
Zasadniczo parametry int i lista są funkcjami, które przekazujesz. Pamiętaj, że Python akceptuje nazwy funkcji jako argumenty. int zwraca 0 domyślnie i wyświetla listę zwraca pustą listę, gdy jest wywoływana w nawiasach.
W normalnych słownikach, jeśli w twoim przykładzie spróbuję zadzwonić
d[a]
, otrzymam błąd (KeyError), ponieważ istnieją tylko klucze m, s, i ip, a klucz a nie został zainicjowany. Ale w defaultdict bierze nazwę funkcji jako argument, kiedy próbujesz użyć klucza, który nie został zainicjowany, po prostu wywołuje przekazaną funkcję i przypisuje jej wartość zwracaną jako wartość nowego klucza.źródło
Ponieważ pytanie dotyczy „jak to działa”, niektórzy czytelnicy mogą chcieć zobaczyć więcej nakrętek i śrub. W szczególności omawiana metoda jest
__missing__(key)
metodą. Zobacz: https://docs.python.org/2/library/collections.html#defaultdict-objects .Mówiąc bardziej konkretnie, ta odpowiedź pokazuje, jak wykorzystać
__missing__(key)
w praktyczny sposób: https://stackoverflow.com/a/17956989/1593924Aby wyjaśnić, co oznacza „wywoływalny”, oto interaktywna sesja (od 2.7.6, ale powinna również działać w wersji 3):
Było to najbardziej typowe użycie defaultdict (z wyjątkiem bezcelowego użycia zmiennej x). Możesz zrobić to samo z 0 jako jawną wartością domyślną, ale nie z prostą wartością:
Zamiast tego działa następująco, ponieważ przekazuje w prostej funkcji (tworzy w locie funkcję bezimienną, która nie przyjmuje argumentów i zawsze zwraca 0):
I z inną wartością domyślną:
źródło
Mój własny 2 ¢: możesz również podklasę defaultdict:
Może się to przydać w bardzo skomplikowanych przypadkach.
źródło
Zachowanie
defaultdict
można łatwo naśladować za pomocądict.setdefault
zamiastd[key]
w każdym połączeniu.Innymi słowy, kod:
jest równa:
Jedyna różnica polega na tym, że przy użyciu
defaultdict
konstruktor listy jest wywoływany tylko raz, a przy użyciudict.setdefault
konstruktora listy jest wywoływany częściej (ale kod może zostać przepisany, aby tego uniknąć, jeśli jest to naprawdę potrzebne).Niektórzy mogą twierdzić, że rozważa się wydajność, ale ten temat to pole minowe. Ten post pokazuje, że nie ma dużego wzrostu wydajności, na przykład przy użyciu defaultdict.
IMO, defaultdict to kolekcja, która wprowadza więcej zamieszania niż korzyści w kodzie. Dla mnie bezużyteczne, ale inni mogą myśleć inaczej.
źródło
Narzędzie defaultdict jest kontenerem w klasie kolekcji Pythona. Jest podobny do zwykłego kontenera słownika (dict), ale ma jedną różnicę: typ danych pól wartości jest określany podczas inicjalizacji.
Na przykład:
To drukuje:
źródło
list
funkcja do wywołania w celu uzupełnienia brakującej wartości, a nie typu obiektów do utworzenia. Na przykład, aby mieć wartość domyślną1
, należy użyć,lambda:1
który oczywiście nie jest typem.Myślę, że najlepiej stosować go zamiast instrukcji skrzynki rozdzielczej. Wyobraź sobie, że mamy instrukcję zmiany przypadku, jak poniżej:
W
switch
python nie ma dostępnych instrukcji case. Możemy osiągnąć to samo, używającdefaultdict
.Drukuje:
W powyższym fragmencie
dd
nie ma klawiszy 4 ani 5, a zatem wypisuje domyślną wartość, którą skonfigurowaliśmy w funkcji pomocnika. Jest to o wiele ładniejsze niż nieprzetworzony słownik, w którymKeyError
wyrzuca się, jeśli klucz nie jest obecny. Z tego wynika, żedefaultdict
bardziej przypomina instrukcję przypadku przełącznika, w której możemy uniknąć skomplikowanychif-elif-elif-else
bloków.Jeszcze jeden dobry przykład, który wywarł na mnie duże wrażenie z tej strony :
Jeśli spróbujemy uzyskać dostęp do elementów innych niż
eggs
ispam
otrzymamy liczbę 0.źródło
Bez
defaultdict
tego prawdopodobnie możesz przypisać nowe wartości do niewidocznych kluczy, ale nie możesz go zmodyfikować. Na przykład:źródło
Cóż, defaultdict może również podnieść błąd klucza w następującym przypadku:
Zawsze pamiętaj o podaniu argumentu defaultdict, np. Defaultdict (int).
źródło
Słownik standardowy zawiera metodę setdefault () do pobierania wartości i ustanawiania wartości domyślnej, jeśli wartość nie istnieje. Natomiast defaultdict pozwala dzwoniącemu określić domyślną wartość z góry podczas inicjowania kontenera.
Działa to dobrze, o ile właściwe jest, aby wszystkie klucze miały takie same wartości domyślne. Może być szczególnie użyteczny, jeśli domyślnym jest typ używany do agregowania lub akumulowania wartości, takich jak lista, zestaw, a nawet liczba całkowita. Standardowa dokumentacja biblioteki zawiera kilka przykładów użycia defaultdict w ten sposób.
źródło
W skrócie:
defaultdict(int)
- argument int wskazuje, że wartości będą typu int.defaultdict(list)
- lista argumentów wskazuje, że wartości będą typu listy.źródło
Dokumentacja i wyjaśnienia są dość oczywiste:
http://docs.python.org/library/collections.html#collections.defaultdict
Przekazana jako argument funkcja typu (int / str itp.) Służy do inicjalizacji wartości domyślnej dla dowolnego klawisza, w którym klucz nie jest obecny w nagraniu.
źródło