Ich habe die Beispiele in Python-Dokumenten gelesen, kann aber immer noch nicht herausfinden, was diese Methode bedeutet. Kann jemand helfen? Hier sind zwei Beispiele aus den Python-Dokumenten
>>> 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)]
und
>>> 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])]
die Parameter int
und list
sind für was?
python
dictionary
default-value
defaultdict
Lanston
quelle
quelle
default_factory = None
Sie es festlegen, nachdem Sie das Standarddiktat vollständig ausgefüllt haben. Siehe diese Frage .Antworten:
Normalerweise löst ein Python-Wörterbuch ein aus,
KeyError
wenn Sie versuchen, ein Element mit einem Schlüssel abzurufen, der sich derzeit nicht im Wörterbuch befindet. Imdefaultdict
Gegensatz dazu werden einfach alle Elemente erstellt, auf die Sie zugreifen möchten (vorausgesetzt, sie sind natürlich noch nicht vorhanden). Um ein solches "Standard" -Element zu erstellen, ruft es das Funktionsobjekt auf, das Sie an den Konstruktor übergeben (genauer gesagt, es ist ein beliebiges "aufrufbares" Objekt, das Funktions- und Typobjekte enthält). Im ersten Beispiel werden Standardelemente mit erstelltint()
, die das ganzzahlige Objekt zurückgeben0
. Im zweiten Beispiel werden Standardelemente mit erstelltlist()
, die ein neues leeres Listenobjekt zurückgeben.quelle
d.get(key, default)
wird Ihr Wörterbuch niemals ändern - es wird nur die Standardeinstellung zurückgeben und das Wörterbuch unverändert lassen.defaultdict
Auf der anderen Seite wird einfügen einen Schlüssel in das Wörterbuch , wenn es noch nicht da ist. Das ist ein großer Unterschied; Sehen Sie sich die Beispiele in der Frage an, um zu verstehen, warum.defaultdict
ruft jeden Konstruktor auf, den Sie übergeben. Wenn Sie einen Typ übergebenT
, werden Werte mit erstelltT()
. Nicht alle Typen können ohne Übergabe von Parametern erstellt werden. Wenn Sie einen solchen Typ erstellen möchten, benötigen Sie eine Wrapper-Funktion oder ähnlichesfunctools.partial(T, arg1, arg2)
.defaultdict
bedeutet, dass, wenn ein Schlüssel nicht im Wörterbuch gefunden wird, anstelle einesKeyError
geworfenen Schlüssels ein neuer Eintrag erstellt wird. Der Typ dieses neuen Eintrags wird durch das Argument defaultdict angegeben.Zum Beispiel:
quelle
0
die Ganzzahl zurück, fallssomeddict = defaultdict(list)
dies der Fall war[ ]
. Ist 0 die Standard-Ganzzahl? Oder [] die Standardliste?0
ist unveränderlich - in CPython sind alle Werte von-5
bis256
zwischengespeicherte Singletons, dies ist jedoch ein implementierungsspezifisches Verhalten - in beiden Fällen wird jedes Mal mitint()
oder eine neue Instanz "erstellt"list()
. Auf diese Weised[k].append(v)
kann gearbeitet werden, ohne das Wörterbuch mit Verweisen auf dieselbe Liste zu füllen, wasdefaultdict
fast unbrauchbar machen würde . Wenn dies das Verhaltendefaultdict
wäre , würde ein Wert, kein Lambda, als Parameter verwendet. (Entschuldigung für die schreckliche Erklärung!)defaultdict
"Das Standardwörterbuch enthält die Methode setdefault () zum Abrufen eines Werts und zum Festlegen eines Standardwerts, wenn der Wert nicht vorhanden ist. Im Gegensatz dazu kann
defaultdict
der Aufrufer den Standardwert (den zurückzugebenden Wert) vorab angeben, wenn der Container initialisiert wird."wie von Doug Hellmann in The Python Standard Library by Example definiert
Verwendung von defaultdict
Standarddict importieren
Standarddict initialisieren
Initialisieren Sie es durch Übergeben
oder
Wie funktioniert es
Wie eine untergeordnete Klasse des Standardwörterbuchs kann sie dieselben Funktionen ausführen.
Bei Übergabe eines unbekannten Schlüssels wird jedoch anstelle eines Fehlers der Standardwert zurückgegeben. Zum Beispiel:
Wenn Sie den Standardwert ändern möchten, überschreiben Sie default_factory:
oder
Beispiele in der Frage
Beispiel 1
Da int als default_factory übergeben wurde, gibt jeder unbekannte Schlüssel standardmäßig 0 zurück.
Wenn der String nun in der Schleife übergeben wird, erhöht sich die Anzahl dieser Alphabete in d.
Beispiel 2
Da eine Liste als default_factory übergeben wurde, gibt jeder unbekannte (nicht vorhandene) Schlüssel standardmäßig [] (dh Liste) zurück.
Wenn nun die Liste der Tupel in der Schleife übergeben wird, wird der Wert in d [Farbe] angehängt.
quelle
Wörterbücher sind eine bequeme Möglichkeit, Daten für den späteren Abruf nach Namen (Schlüssel) zu speichern. Schlüssel müssen eindeutige, unveränderliche Objekte sein und sind normalerweise Zeichenfolgen. Die Werte in einem Wörterbuch können beliebig sein. Für viele Anwendungen sind die Werte einfache Typen wie Ganzzahlen und Zeichenfolgen.
Interessanter wird es, wenn die Werte in einem Wörterbuch Sammlungen (Listen, Diktate usw.) sind. In diesem Fall muss der Wert (eine leere Liste oder ein Diktat) bei der ersten Verwendung eines bestimmten Schlüssels initialisiert werden. Während dies manuell relativ einfach ist, automatisiert und vereinfacht der Standarddict-Typ diese Art von Vorgängen. Ein Standarddikt funktioniert genau wie ein normales Diktat, wird jedoch mit einer Funktion („Standardfactory“) initialisiert, die keine Argumente akzeptiert und den Standardwert für einen nicht vorhandenen Schlüssel bereitstellt.
Ein Standarddikt löst niemals einen KeyError aus. Jeder nicht vorhandene Schlüssel erhält den von der Standardfactory zurückgegebenen Wert.
Hier ist ein weiteres Beispiel, wie wir mit defaultdict die Komplexität reduzieren können
Wenn Sie ein Wörterbuch benötigen und der Wert jedes Elements mit einem Standardwert beginnen sollte, verwenden Sie abschließend ein Standarddiktat.
quelle
Hier finden Sie eine gute Erklärung für Standardverbote: http://ludovf.net/blog/python-collections-defaultdict/
Grundsätzlich sind die Parameter int und list Funktionen, die Sie übergeben. Denken Sie daran, dass Python Funktionsnamen als Argumente akzeptiert. int gibt standardmäßig 0 zurück und list gibt eine leere Liste zurück, wenn sie mit Klammern aufgerufen wird.
Wenn ich in normalen Wörterbüchern in Ihrem Beispiel versuche aufzurufen
d[a]
, wird eine Fehlermeldung (KeyError) angezeigt, da nur die Schlüssel m, s, i und p vorhanden sind und der Schlüssel a nicht initialisiert wurde. In einem Standarddikt wird jedoch ein Funktionsname als Argument verwendet. Wenn Sie versuchen, einen Schlüssel zu verwenden, der nicht initialisiert wurde, ruft er einfach die übergebene Funktion auf und weist ihren Rückgabewert als Wert des neuen Schlüssels zu.quelle
Da es um "wie es funktioniert" geht, möchten einige Leser vielleicht mehr Schrauben und Muttern sehen. Insbesondere ist die fragliche
__missing__(key)
Methode die Methode. Siehe: https://docs.python.org/2/library/collections.html#defaultdict-objects .Genauer gesagt zeigt diese Antwort, wie man sie auf
__missing__(key)
praktische Weise nutzt : https://stackoverflow.com/a/17956989/1593924Um zu verdeutlichen, was "aufrufbar" bedeutet, folgt eine interaktive Sitzung (ab 2.7.6, sollte aber auch in Version 3 funktionieren):
Dies war die typischste Verwendung von defaultdict (mit Ausnahme der sinnlosen Verwendung der Variablen x). Sie können dasselbe mit 0 als expliziten Standardwert tun, jedoch nicht mit einem einfachen Wert:
Stattdessen funktioniert Folgendes, weil es eine einfache Funktion übergibt (es erstellt im laufenden Betrieb eine namenlose Funktion, die keine Argumente akzeptiert und immer 0 zurückgibt):
Und mit einem anderen Standardwert:
quelle
Meine eigene 2 ¢: Sie können auch defaultdict unterordnen:
Dies kann in sehr komplexen Fällen nützlich sein.
quelle
Das Verhalten von
defaultdict
kann leicht nachgeahmt werden,dict.setdefault
anstattd[key]
bei jedem Anruf.Mit anderen Worten, der Code:
ist äquivalent zu:
Der einzige Unterschied besteht darin, dass der Listenkonstruktor bei
defaultdict
Verwendung nur einmal aufgerufen wird und die Verwendungdict.setdefault
des Listenkonstruktors häufiger aufgerufen wird (der Code kann jedoch möglicherweise neu geschrieben werden, um dies zu vermeiden, falls dies wirklich erforderlich ist).Einige mögen argumentieren, dass es eine Leistungsüberlegung gibt, aber dieses Thema ist ein Minenfeld. Dieser Beitrag zeigt, dass die Verwendung von defaultdict zum Beispiel keinen großen Leistungsgewinn bringt.
IMO, defaultdict ist eine Sammlung, die dem Code mehr Verwirrung als Vorteile bringt. Für mich nutzlos, aber andere denken vielleicht anders.
quelle
Das defaultdict-Tool ist ein Container in der Sammlungsklasse von Python. Es ähnelt dem üblichen Wörterbuchcontainer (dict), hat jedoch einen Unterschied: Der Datentyp der Wertefelder wird bei der Initialisierung angegeben.
Zum Beispiel:
Dies druckt:
quelle
list
ist die Funktion, die aufgerufen werden muss, um einen fehlenden Wert einzugeben, nicht den Typ der zu erstellenden Objekte. Um beispielsweise einen Standardwert von zu haben1
, würden Sie verwenden,lambda:1
der offensichtlich kein Typ ist.Ich denke, es wird am besten anstelle einer switch case-Anweisung verwendet. Stellen Sie sich vor, wir haben eine Switch-Case-Anweisung wie folgt:
switch
In Python sind keine case-Anweisungen verfügbar. Wir können das gleiche erreichen, indem wir verwendendefaultdict
.Es druckt:
Im obigen Snippet
dd
gibt es keine Tasten 4 oder 5 und daher wird ein Standardwert ausgedruckt, den wir in einer Hilfsfunktion konfiguriert haben. Dies ist viel schöner als ein Rohwörterbuch, bei dem aKeyError
ausgelöst wird, wenn der Schlüssel nicht vorhanden ist. Daraus ergibt sich, dass es sichdefaultdict
eher um eine Switch-Case-Anweisung handelt, bei der komplizierteif-elif-elif-else
Blöcke vermieden werden können.Ein weiteres gutes Beispiel, das mich auf dieser Website sehr beeindruckt hat, ist:
Wenn wir versuchen , alle Elemente für den Zugriff auf andere als
eggs
undspam
wir werden eine Anzahl von 0 erhalten.quelle
Ohne
defaultdict
können Sie möglicherweise unsichtbaren Schlüsseln neue Werte zuweisen, diese jedoch nicht ändern. Zum Beispiel:quelle
Nun, defaultdict kann im folgenden Fall auch den Schlüsselfehler erhöhen:
Denken Sie immer daran, dem defaultdict wie defaultdict (int) Argumente zu geben.
quelle
Das Standardwörterbuch enthält die Methode setdefault () zum Abrufen eines Werts und zum Festlegen eines Standards, wenn der Wert nicht vorhanden ist. Im Gegensatz dazu kann der Anrufer mit defaultdict die Standardeinstellung im Voraus festlegen, wenn der Container initialisiert wird.
Dies funktioniert gut, solange alle Schlüssel dieselbe Standardeinstellung haben. Dies kann besonders nützlich sein, wenn der Standard ein Typ ist, der zum Aggregieren oder Akkumulieren von Werten verwendet wird, z. B. eine Liste, eine Menge oder sogar int. Die Standardbibliotheksdokumentation enthält mehrere Beispiele für die Verwendung von defaultdict auf diese Weise.
quelle
Zusamenfassend:
defaultdict(int)
- Das Argument int gibt an, dass die Werte vom Typ int sind.defaultdict(list)
- Die Argumentliste gibt an, dass die Werte vom Listentyp sind.quelle
Die Dokumentation und die Erklärung sind ziemlich selbsterklärend:
http://docs.python.org/library/collections.html#collections.defaultdict
Die als Argument übergebene Typfunktion (int / str usw.) wird verwendet, um einen Standardwert für einen bestimmten Schlüssel zu initialisieren, bei dem der Schlüssel im Diktat nicht vorhanden ist.
quelle