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_factory
viene invece chiamato:
>>> a.default_factory
<type 'list'>
Questo è quello che vedi quando ti trovi print a
prima 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 defaultdict
il 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 KeyError
un'eccezione (come un errore, che ti dice che non è riuscito a trovare quella chiave). Ma in a defaultdict
, chiama invece la default_factory
funzione per creare un nuovo valore predefinito (che è il "predefinito" in defaultdict
) per te.
pickle
(per salvare oggetti python in un file) non può gestire defaultdict
i 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 json
module
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 defaultdict
in un dict
puoi 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)