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']}
python
defaultdict
user2988464
quelle
quelle
dict(number_to_letter)
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.
quelle
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 Siedefaultdict
die erste gemacht haben, wiedefaultdict(int)
oderdefaultdict(list)
. Wenn Sie versuchen, einen Schlüssel im Wörterbuch nachzuschlagen, wiea['3']
zum Beispiel in einem normalen Wörterbuch, erhalten Sie entweder den Wert oder es wird eineKeyError
Ausnahme ausgelöst (wie ein Fehler, der Ihnen mitteilt, dass dieser Schlüssel nicht gefunden werden konnte). In adefaultdict
wird stattdessen diedefault_factory
Funktion aufgerufen, um einen neuen Standardwert (das ist der "Standard" indefaultdict
) 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
Modulsimport 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.
quelle
Wenn Sie sogar eine rekursive Version zum Konvertieren einer rekursiven
defaultdict
in eine möchtendict
, 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)
quelle
defaultdict(lambda: defaultdict(int))
):{k: dict(v) for k, v in foo.items()}