Wie kann ich ein Standarddikt konvertieren?
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
ein gemeinsames Diktat sein?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Wie kann ich ein Standarddikt konvertieren?
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
ein gemeinsames Diktat sein?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Antworten:
Sie können einfach anrufen dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
Aber denken Sie daran, dass ein Standarddikt ein Diktat ist :
>>> isinstance(a, dict)
True
Nur mit etwas anderem Verhalten, wenn Sie versuchen, auf einen Schlüssel zuzugreifen, der fehlt - was normalerweise einen auslösen würde KeyError
-, default_factory
wird stattdessen Folgendes aufgerufen:
>>> a.default_factory
<type 'list'>
Das sehen Sie, wenn Sie print a
vor der Datenseite des Wörterbuchs erscheinen.
Ein weiterer Trick, um ein diktatischeres Verhalten wiederherzustellen, ohne tatsächlich ein neues Objekt zu erstellen, ist das Zurücksetzen default_factory
:
>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
a[4].append(10)
KeyError: 4
Aber die meiste Zeit ist das die Mühe nicht wert.
default_factory
? Ich habe einfach keine Ahnung, was los ist. Es tut uns leid.
default_factory
- das ist die Funktion, die Sie übergeben haben, als Sie defaultdict
die erste gemacht haben, wie defaultdict(int)
oder defaultdict(list)
. Wenn Sie versuchen, einen Schlüssel im Wörterbuch nachzuschlagen, wie a['3']
zum Beispiel in einem normalen Wörterbuch, erhalten Sie entweder den Wert oder es wird eine KeyError
Ausnahme ausgelöst (wie ein Fehler, der Ihnen mitteilt, dass dieser Schlüssel nicht gefunden werden konnte). In a defaultdict
wird stattdessen die default_factory
Funktion aufgerufen, um einen neuen Standardwert (das ist der "Standard" in defaultdict
) für Sie festzulegen.
pickle
(zum Speichern von Python-Objekten in einer Datei) defaultdict
s unter vielen Umständen nicht verarbeitet werden kann .
Wenn Ihr Standarddikt rekursiv definiert ist, zum Beispiel:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
Eine weitere einfache Möglichkeit, defaultdict wieder in dict umzuwandeln, ist die Verwendung des json
Moduls
import json
data = json.loads(json.dumps(data))
und natürlich müssen die in Ihrem Standarddikt enthaltenen Werte auf von JSON unterstützte Datentypen beschränkt sein, aber es sollte kein Problem sein, wenn Sie nicht beabsichtigen, Klassen oder Funktionen im Diktat zu speichern.
Wenn Sie sogar eine rekursive Version zum Konvertieren einer rekursiven defaultdict
in eine möchten dict
, können Sie Folgendes versuchen:
#! /usr/bin/env python3
from collections import defaultdict
def ddict():
return defaultdict(ddict)
def ddict2dict(d):
for k, v in d.items():
if isinstance(v, dict):
d[k] = ddict2dict(v)
return dict(d)
myddict = ddict()
myddict["a"]["b"]["c"] = "value"
print(myddict)
mydict = ddict2dict(myddict)
print(mydict)
defaultdict(lambda: defaultdict(int))
): {k: dict(v) for k, v in foo.items()}
dict(number_to_letter)