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_factorywird stattdessen Folgendes aufgerufen:
>>> a.default_factory
<type 'list'>
Das sehen Sie, wenn Sie print avor 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 defaultdictdie 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 KeyErrorAusnahme ausgelöst (wie ein Fehler, der Ihnen mitteilt, dass dieser Schlüssel nicht gefunden werden konnte). In a defaultdictwird stattdessen die default_factoryFunktion aufgerufen, um einen neuen Standardwert (das ist der "Standard" in defaultdict) für Sie festzulegen.
pickle(zum Speichern von Python-Objekten in einer Datei) defaultdicts 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 jsonModuls
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 defaultdictin 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)