Inhaltsverzeichnis
Verwenden Sie Urteilsaussagen zur Überprüfung
Verwenden Sie die Methode dict.setdefault()
Verwenden Sie die Klasse „collections.defaultdict“
Wie die Defaultdict-Klasse implementiert wird
Implementierung der Funktion von defaultdict in älteren Versionen von Python
Heim Backend-Entwicklung Python-Tutorial Ausführliche Erklärung von defaultdict in Python (Codebeispiel)

Ausführliche Erklärung von defaultdict in Python (Codebeispiel)

Oct 25, 2018 pm 05:34 PM
defaultdict python

Dieser Artikel bietet Ihnen eine detaillierte Erklärung (Codebeispiel) von defaultdict in Python. Ich hoffe, dass er Ihnen als Referenz dienen wird.

Standardwerte können sehr praktisch sein

Wie wir alle wissen, kommt es in Python zu einer KeyError-Ausnahme, wenn Sie auf einen Schlüssel zugreifen, der nicht im Wörterbuch vorhanden ist wird ausgelöst (in JavaScript wird undefiniert zurückgegeben, wenn ein bestimmter Schlüssel nicht im Objektattribut vorhanden ist). Manchmal ist es jedoch sehr praktisch, für jeden Schlüssel im Wörterbuch einen Standardwert zu haben. Zum Beispiel das folgende Beispiel:

strings = ('puppy', 'kitten', 'puppy', 'puppy',
           'weasel', 'puppy', 'kitten', 'puppy')
counts = {}
for kw in strings:
    counts[kw] += 1
Nach dem Login kopieren

Dieses Beispiel zählt, wie oft ein Wort in Zeichenfolgen vorkommt, und zeichnet es im Zählwörterbuch auf. Jedes Mal, wenn ein Wort erscheint, wird der im Schlüssel gespeicherte Wert entsprechend counts um 1 erhöht. Tatsächlich wird beim Ausführen dieses Codes eine KeyError-Ausnahme ausgelöst, wenn jedes Wort zum ersten Mal gezählt wird. Da es in Pythons Diktat keinen Standardwert gibt, kann dies in der Python-Befehlszeile überprüft werden:

>>> counts = dict()
>>> counts
{}
>>> counts['puppy'] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: &#39;puppy&#39;
Nach dem Login kopieren

Verwenden Sie Urteilsaussagen zur Überprüfung

In diesem Fall besteht die erste denkbare Möglichkeit darin, einen Standardwert von 1 im entsprechenden Schlüssel in counts zu speichern, wenn das Wort zum ersten Mal gezählt wird. Dies erfordert das Hinzufügen einer Urteilsaussage während der Verarbeitung:
strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = {}
for kw in strings:
    if kw not in counts:
        counts[kw] = 1
    else:
        counts[kw] += 1
# counts:
# {&#39;puppy&#39;: 5, &#39;weasel&#39;: 1, &#39;kitten&#39;: 2}
Nach dem Login kopieren

Verwenden Sie die Methode dict.setdefault()

Sie können den Standardwert auch über die Methode dict.setdefault() festlegen:

strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = {}
for kw in strings:
    counts.setdefault(kw, 0)
    counts[kw] += 1
Nach dem Login kopieren

Die Methode dict.setdefault() empfängt zwei Parameter. Der erste Parameter ist der Name des Schlüssels und der zweite Parameter ist der Standardwert. Wenn der angegebene Schlüssel nicht im Wörterbuch vorhanden ist, wird der im Parameter angegebene Standardwert zurückgegeben. Andernfalls wird der im Wörterbuch gespeicherte Wert zurückgegeben. Der Code in der for-Schleife kann mithilfe des Rückgabewerts der Methode dict.setdefault() umgeschrieben werden, um ihn prägnanter zu gestalten:

strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = {}
for kw in strings:
    counts[kw] = counts.setdefault(kw, 0) + 1
Nach dem Login kopieren

Verwenden Sie die Klasse „collections.defaultdict“

Obwohl die obige Methode verwendet wird ist bis zu einem gewissen Grad Dies löst das Problem, dass es im Diktat keinen Standardwert gibt, aber zu diesem Zeitpunkt werden wir uns fragen, ob es ein Wörterbuch gibt, das selbst die Funktion des Standardwerts bereitstellt? Die Antwort lautet: Ja, es istcollections.defaultdict.

Die defaultdict-Klasse ähnelt einem Diktat, wird jedoch mit einem Typ initialisiert:

>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> dd
defaultdict(<type &#39;list&#39;>, {})
Nach dem Login kopieren

Die Initialisierungsfunktion der defaultdict-Klasse akzeptiert einen Typ als Parameter und kann instanziiert werden, wenn der Schlüssel, auf den zugegriffen wird, dies tut nicht vorhanden Ändern Sie einen Wert als Standardwert:

>>> dd[&#39;foo&#39;]
[]
>>> dd
defaultdict(<type &#39;list&#39;>, {&#39;foo&#39;: []})
>>> dd[&#39;bar&#39;].append(&#39;quux&#39;)
>>> dd
defaultdict(<type &#39;list&#39;>, {&#39;foo&#39;: [], &#39;bar&#39;: [&#39;quux&#39;]})
Nach dem Login kopieren

Es ist zu beachten, dass diese Form des Standardwerts nur gültig ist, wenn auf dict[key] oder dict.__getitem__(key) zugegriffen wird. Die Gründe dafür werden im Folgenden vorgestellt.

>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> &#39;something&#39; in dd
False
>>> dd.pop(&#39;something&#39;)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: &#39;pop(): dictionary is empty&#39;
>>> dd.get(&#39;something&#39;)
>>> dd[&#39;something&#39;]
[]
Nach dem Login kopieren

Diese Klasse akzeptiert nicht nur den Typnamen als Parameter der Initialisierungsfunktion, sondern kann auch jede aufrufbare Funktion ohne Parameter verwenden. Zu diesem Zeitpunkt wird das Rückgabeergebnis der Funktion als Standardwert verwendet , wodurch die Standardwerte flexibler werden. Im Folgenden wird anhand eines Beispiels veranschaulicht, wie die benutzerdefinierte Funktion null () ohne Parameter als Parameter der Initialisierungsfunktion verwendet wird:

>>> from collections import defaultdict
>>> def zero():
...     return 0
...
>>> dd = defaultdict(zero)
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {})
>>> dd[&#39;foo&#39;]
0
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {&#39;foo&#39;: 0})
Nach dem Login kopieren

Verwenden Sie collections.defaultdict, um das anfängliche Wortzählproblem zu lösen. Der Code lautet wie folgt :

from collections import defaultdict
strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = defaultdict(lambda: 0)  # 使用lambda来定义简单的函数
for s in strings:
    counts[s] += 1
Nach dem Login kopieren

Wie die Defaultdict-Klasse implementiert wird

Durch den obigen Inhalt müssen Sie die Verwendung der Defaultdict-Klasse verstanden haben. Wie implementiert man also die Standardwertfunktion in der Defaultdict-Klasse? Der Schlüssel dazu ist die Verwendung der Methode __missing__():

>>> from collections import defaultdict
>>> print defaultdict.__missing__.__doc__
__missing__(key) # Called by __getitem__ for missing key; pseudo-code:
  if self.default_factory is None: raise KeyError(key)
  self[key] = value = self.default_factory()
  return value
Nach dem Login kopieren

Wenn wir uns den Dokumentstring der Methode __missing__() ansehen, können wir sehen, dass wir die Methode __getitem__() verwenden, um auf ein nicht vorhandenes Objekt zuzugreifen key (Die Form dict[key] ist eigentlich eine vereinfachte Form der Methode __getitem__()), die die Methode __missing__() aufruft, um den Standardwert abzurufen und den Schlüssel zum Wörterbuch hinzuzufügen.

Eine ausführliche Einführung in die Methode __missing__() finden Sie im Abschnitt „Mapping Types – dict“ in der offiziellen Python-Dokumentation.

Ab Version 2.5 im Dokument eingeführt: Wenn eine von dict abgeleitete Unterklasse die Methode __missing__() definiert, ruft dict[key] beim Zugriff auf einen nicht vorhandenen Schlüssel die Methode __missing__() auf, um sie abzurufen Standardwert.

Daraus ist ersichtlich, dass dict zwar die Methode __missing__() unterstützt, diese Methode jedoch nicht in dict selbst vorhanden ist. Stattdessen muss diese Methode in der abgeleiteten Unterklasse implementiert werden. Dies kann leicht überprüft werden:

>>> print dict.__missing__.__doc__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object &#39;dict&#39; has no attribute &#39;__missing__&#39;
Nach dem Login kopieren

Gleichzeitig können wir weitere Experimente durchführen, eine Unterklasse Missing definieren und die Methode __missing__() implementieren:

>>> class Missing(dict):
...     def __missing__(self, key):
...         return &#39;missing&#39;
...
>>> d = Missing()
>>> d
{}
>>> d[&#39;foo&#39;]
&#39;missing&#39;
>>> d
{}
Nach dem Login kopieren

Das Rückgabeergebnis spiegelt __missing__( ) wider. Methode funktioniert. Auf dieser Basis modifizieren wir die Methode __missing__() leicht, sodass diese Unterklasse einen Standardwert für nicht vorhandene Schlüssel wie die Klasse defautldict festlegt:

>>> class Defaulting(dict):
...     def __missing__(self, key):
...         self[key] = &#39;default&#39;
...         return &#39;default&#39;
...
>>> d = Defaulting()
>>> d
{}
>>> d[&#39;foo&#39;]
&#39;default&#39;
>>> d
{&#39;foo&#39;: &#39;default&#39;}
Nach dem Login kopieren

Implementierung der Funktion von defaultdict in älteren Versionen von Python

Die Klasse „defaultdict“ wurde nach Version 2.5 hinzugefügt und wird in einigen älteren Versionen nicht unterstützt. Daher ist es erforderlich, eine kompatible Klasse „defaultdict“ für ältere Versionen zu implementieren. Dies ist eigentlich sehr einfach. Obwohl die Leistung möglicherweise nicht so gut ist wie die Standardklasse in Version 2.5, ist sie funktional dieselbe.

Zuerst muss die Methode __getitem__() die Methode __missing__() aufrufen, wenn der Zugriffsschlüssel fehlschlägt:

class defaultdict(dict):
    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)
Nach dem Login kopieren

Zweitens muss die Methode __missing__() implementiert werden, um den Standardwert festzulegen:

class defaultdict(dict):
    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)
    def __missing__(self, key):
        self[key] = value = self.default_factory()
        return value
Nach dem Login kopieren

Dann muss die Initialisierungsfunktion __init__() der Defaultdict-Klasse Typ- oder aufrufbare Funktionsparameter akzeptieren:

class defaultdict(dict):
    def __init__(self, default_factory=None, *a, **kw):
        dict.__init__(self, *a, **kw)
        self.default_factory = default_factory    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)
    def __missing__(self, key):
        self[key] = value = self.default_factory()
        return value
Nach dem Login kopieren

最后,综合以上内容,通过以下方式完成兼容新旧Python版本的代码:

try:
    from collections import defaultdictexcept ImportError:
    class defaultdict(dict):
      def __init__(self, default_factory=None, *a, **kw):
          dict.__init__(self, *a, **kw)
          self.default_factory = default_factory      def __getitem__(self, key):
          try:
              return dict.__getitem__(self, key)
          except KeyError:
              return self.__missing__(key)

      def __missing__(self, key):
          self[key] = value = self.default_factory()
          return value
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung von defaultdict in Python (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP und Python: Code Beispiele und Vergleich PHP und Python: Code Beispiele und Vergleich Apr 15, 2025 am 12:07 AM

PHP und Python haben ihre eigenen Vor- und Nachteile, und die Wahl hängt von den Projektbedürfnissen und persönlichen Vorlieben ab. 1.PHP eignet sich für eine schnelle Entwicklung und Wartung großer Webanwendungen. 2. Python dominiert das Gebiet der Datenwissenschaft und des maschinellen Lernens.

Python gegen JavaScript: Community, Bibliotheken und Ressourcen Python gegen JavaScript: Community, Bibliotheken und Ressourcen Apr 15, 2025 am 12:16 AM

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Detaillierte Erklärung des Docker -Prinzips Detaillierte Erklärung des Docker -Prinzips Apr 14, 2025 pm 11:57 PM

Docker verwendet Linux -Kernel -Funktionen, um eine effiziente und isolierte Anwendungsumgebung zu bieten. Sein Arbeitsprinzip lautet wie folgt: 1. Der Spiegel wird als schreibgeschützte Vorlage verwendet, die alles enthält, was Sie für die Ausführung der Anwendung benötigen. 2. Das Union File System (UnionFS) stapelt mehrere Dateisysteme, speichert nur die Unterschiede, speichert Platz und beschleunigt. 3. Der Daemon verwaltet die Spiegel und Container, und der Kunde verwendet sie für die Interaktion. 4. Namespaces und CGroups implementieren Container -Isolation und Ressourcenbeschränkungen; 5. Mehrere Netzwerkmodi unterstützen die Containerverbindung. Nur wenn Sie diese Kernkonzepte verstehen, können Sie Docker besser nutzen.

So führen Sie Programme in der terminalen VSCODE aus So führen Sie Programme in der terminalen VSCODE aus Apr 15, 2025 pm 06:42 PM

Im VS -Code können Sie das Programm im Terminal in den folgenden Schritten ausführen: Erstellen Sie den Code und öffnen Sie das integrierte Terminal, um sicherzustellen, dass das Codeverzeichnis mit dem Terminal Working -Verzeichnis übereinstimmt. Wählen Sie den Befehl aus, den Befehl ausführen, gemäß der Programmiersprache (z. B. Pythons Python your_file_name.py), um zu überprüfen, ob er erfolgreich ausgeführt wird, und Fehler auflösen. Verwenden Sie den Debugger, um die Debugging -Effizienz zu verbessern.

Kann Visual Studio -Code in Python verwendet werden Kann Visual Studio -Code in Python verwendet werden Apr 15, 2025 pm 08:18 PM

VS -Code kann zum Schreiben von Python verwendet werden und bietet viele Funktionen, die es zu einem idealen Werkzeug für die Entwicklung von Python -Anwendungen machen. Sie ermöglichen es Benutzern: Installation von Python -Erweiterungen, um Funktionen wie Code -Abschluss, Syntax -Hervorhebung und Debugging zu erhalten. Verwenden Sie den Debugger, um Code Schritt für Schritt zu verfolgen, Fehler zu finden und zu beheben. Integrieren Sie Git für die Versionskontrolle. Verwenden Sie Tools für die Codeformatierung, um die Codekonsistenz aufrechtzuerhalten. Verwenden Sie das Lining -Tool, um potenzielle Probleme im Voraus zu erkennen.

Python: Automatisierung, Skript- und Aufgabenverwaltung Python: Automatisierung, Skript- und Aufgabenverwaltung Apr 16, 2025 am 12:14 AM

Python zeichnet sich in Automatisierung, Skript und Aufgabenverwaltung aus. 1) Automatisierung: Die Sicherungssicherung wird durch Standardbibliotheken wie OS und Shutil realisiert. 2) Skriptschreiben: Verwenden Sie die PSUTIL -Bibliothek, um die Systemressourcen zu überwachen. 3) Aufgabenverwaltung: Verwenden Sie die Zeitplanbibliothek, um Aufgaben zu planen. Die Benutzerfreundlichkeit von Python und die Unterstützung der reichhaltigen Bibliothek machen es zum bevorzugten Werkzeug in diesen Bereichen.

Kann gegen Code in Windows 8 ausgeführt werden Kann gegen Code in Windows 8 ausgeführt werden Apr 15, 2025 pm 07:24 PM

VS -Code kann unter Windows 8 ausgeführt werden, aber die Erfahrung ist möglicherweise nicht großartig. Stellen Sie zunächst sicher, dass das System auf den neuesten Patch aktualisiert wurde, und laden Sie dann das VS -Code -Installationspaket herunter, das der Systemarchitektur entspricht und sie wie aufgefordert installiert. Beachten Sie nach der Installation, dass einige Erweiterungen möglicherweise mit Windows 8 nicht kompatibel sind und nach alternativen Erweiterungen suchen oder neuere Windows -Systeme in einer virtuellen Maschine verwenden müssen. Installieren Sie die erforderlichen Erweiterungen, um zu überprüfen, ob sie ordnungsgemäß funktionieren. Obwohl VS -Code unter Windows 8 möglich ist, wird empfohlen, auf ein neueres Windows -System zu upgraden, um eine bessere Entwicklungserfahrung und Sicherheit zu erzielen.

Ist die VSCODE -Erweiterung bösartig? Ist die VSCODE -Erweiterung bösartig? Apr 15, 2025 pm 07:57 PM

VS -Code -Erweiterungen stellen böswillige Risiken dar, wie das Verstecken von böswilligem Code, das Ausbeutetieren von Schwachstellen und das Masturbieren als legitime Erweiterungen. Zu den Methoden zur Identifizierung böswilliger Erweiterungen gehören: Überprüfung von Verlegern, Lesen von Kommentaren, Überprüfung von Code und Installation mit Vorsicht. Zu den Sicherheitsmaßnahmen gehören auch: Sicherheitsbewusstsein, gute Gewohnheiten, regelmäßige Updates und Antivirensoftware.

See all articles