Come posso convertire un file defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
essere un dict comune?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Come posso convertire un file defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
essere un dict comune?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Risposte:
Puoi semplicemente chiamare dict:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
ma ricorda che un defaultdict è un dict:
>>> isinstance(a, dict)
True
solo con un comportamento leggermente diverso, in quanto quando provi ad accedere a una chiave che manca - che normalmente solleverebbe a KeyError- default_factoryviene invece chiamato:
>>> a.default_factory
<type 'list'>
Questo è quello che vedi quando ti trovi print aprima che appaia il lato dati del dizionario.
Quindi un altro trucco per ottenere un comportamento più dictlike senza effettivamente creare un nuovo oggetto è ripristinare 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
ma il più delle volte questo non vale la pena.
default_factory? Non ho la più pallida idea di cosa stia succedendo. Scusate.
default_factory- questa è la funzione che hai passato quando hai creato defaultdictil primo posto, come defaultdict(int)o defaultdict(list). Ogni volta che provi a cercare una chiave nel dizionario, come a['3'], ad esempio, in un normale dizionario o ottieni il valore o solleva KeyErrorun'eccezione (come un errore, che ti dice che non è riuscito a trovare quella chiave). Ma in a defaultdict, chiama invece la default_factoryfunzione per creare un nuovo valore predefinito (che è il "predefinito" in defaultdict) per te.
pickle(per salvare oggetti python in un file) non può gestire defaultdicti messaggi di posta elettronica in molte circostanze .
Se il tuo defaultdict è definito in modo ricorsivo, ad esempio:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
un altro modo semplice per riconvertire defaultdict in dict è usare jsonmodule
import json
data = json.loads(json.dumps(data))
e, naturalmente, i valori contenuti nel tuo defaultdict devono essere limitati ai tipi di dati supportati da json, ma non dovrebbe essere un problema se non intendi memorizzare classi o funzioni nel dict.
Se vuoi anche una versione ricorsiva per convertire un ricorsivo defaultdictin un dictpuoi provare quanto segue:
#! /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)