Comment puis-je convertir un defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
être un dicton commun?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Vous pouvez simplement appeler dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
mais rappelez-vous qu'un defaultdict is un dict:
>>> isinstance(a, dict)
True
juste avec un comportement légèrement différent, en ce sens que lorsque vous essayez d’accéder à une clé manquante - qui déclencherait normalement un KeyError
- le default_factory
est appelé à la place:
>>> a.default_factory
<type 'list'>
C'est ce que vous voyez quand vous print a
avant que le côté données du dictionnaire apparaisse.
Donc, une autre astuce pour obtenir un comportement plus dicticile sans créer un nouvel objet consiste à réinitialiser 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
mais la plupart du temps, cela ne vaut pas la peine.
Si votre defaultdict est défini de manière récursive, par exemple:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
un autre moyen simple de reconvertir defaultdict en dict est d’utiliser json
module.
import json
data = json.loads(json.dumps(data))
et bien sûr, les valeurs contenues dans votre defaultdict doivent être limitées aux types de données pris en charge par json, mais cela ne devrait pas être un problème si vous n'avez pas l'intention de stocker des classes ou des fonctions dans le dict.
Si vous voulez même une version récursive pour convertir un defaultdict
récursif en un dict
, vous pouvez essayer les solutions suivantes:
#! /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)