Comment puis-je convertir un defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
être un dict commun?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
python
defaultdict
user2988464
la source
la source
dict(number_to_letter)
Réponses:
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 est un dict:
>>> isinstance(a, dict) True
juste avec un comportement légèrement différent, en ce que lorsque vous essayez d'accéder à une clé qui manque - ce qui soulèverait normalement un
KeyError
- ledefault_factory
est appelé à la place:>>> a.default_factory <type 'list'>
C'est ce que vous voyez lorsque vous voyez
print a
le côté données du dictionnaire apparaître.Donc, une autre astuce pour obtenir un comportement plus dictlike sans créer un nouvel objet est de 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.
la source
default_factory
? Je n'ai simplement aucune idée de ce qui se passe. Pardon.default_factory
- c'est la fonction que vous avez passée lorsque vous avez fait ledefaultdict
en premier lieu, commedefaultdict(int)
oudefaultdict(list)
. Chaque fois que vous essayez de rechercher une clé dans le dictionnaire, commea['3']
, par exemple, dans un dictionnaire habituel, vous obtenez la valeur ou cela déclenche uneKeyError
exception (comme une erreur, vous indiquant qu'il n'a pas pu trouver cette clé). Mais dans adefaultdict
, il appelle à la place ladefault_factory
fonction pour créer une nouvelle valeur par défaut (c'est la "valeur par défaut"defaultdict
) pour vous.pickle
(pour enregistrer des objets python dans un fichier) ne peut pas gérer lesdefaultdict
s dans de nombreuses circonstances .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
encore un autre moyen simple de reconvertir defaultdict en dict est d'utiliser le
json
moduleimport json data = json.loads(json.dumps(data))
et bien sûr, les valeurs contenues dans votre defaultdict doivent être confinées aux types de données pris en charge par json, mais cela ne devrait pas poser de problème si vous n'avez pas l'intention de stocker des classes ou des fonctions dans le dict.
la source
Si vous voulez même une version récursive pour convertir un récursif
defaultdict
en un,dict
vous pouvez essayer ce qui suit:#! /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)
la source
defaultdict(lambda: defaultdict(int))
):{k: dict(v) for k, v in foo.items()}