Jak mogę przekonwertować plik defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
być powszechnym nakazem?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Jak mogę przekonwertować plik defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
być powszechnym nakazem?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Odpowiedzi:
Możesz po prostu zadzwonić dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
ale pamiętaj, że defaultdict to dict:
>>> isinstance(a, dict)
True
tylko z nieco innym zachowaniem, polegającym na tym, że gdy próbujesz uzyskać dostęp do brakującego klucza - co zwykle spowodowałoby podniesienie a KeyError
- default_factory
zamiast tego wywoływana jest:
>>> a.default_factory
<type 'list'>
To właśnie widzisz, print a
zanim pojawi się strona danych słownika.
Więc kolejną sztuczką, aby odzyskać bardziej dyktanda bez tworzenia nowego obiektu, jest zresetowanie 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
ale w większości przypadków nie jest to warte zachodu.
default_factory
? Po prostu nie mam pojęcia, co się dzieje. Przepraszam.
default_factory
- jest to funkcja, którą przekazałeś, kiedy tworzyłeś defaultdict
w pierwszej kolejności, na przykład defaultdict(int)
lub defaultdict(list)
. Za każdym razem, gdy próbujesz wyszukać klucz w słowniku, a['3']
na przykład w zwykłym słowniku, albo dostajesz wartość, albo zgłasza KeyError
wyjątek (jak błąd, informujący, że nie może znaleźć tego klucza). Ale w a defaultdict
zamiast tego wywołuje default_factory
funkcję, aby utworzyć nową wartość domyślną (to jest „domyślna” w defaultdict
) dla Ciebie.
pickle
(do zapisywania obiektów Pythona do pliku) defaultdict
w wielu przypadkach nie obsługuje plików s .
Jeśli Twój defaultdict jest zdefiniowany rekurencyjnie, na przykład:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
jeszcze innym prostym sposobem na konwersję defaultdict z powrotem do dict jest użycie json
module
import json
data = json.loads(json.dumps(data))
i oczywiście wartości zawarte w twoim defaultdict muszą być ograniczone do obsługiwanych przez json typów danych, ale nie powinno to stanowić problemu, jeśli nie zamierzasz przechowywać klas lub funkcji w dict.
Jeśli nawet potrzebujesz wersji rekurencyjnej do konwersji rekurencyjnej defaultdict
na a dict
, możesz spróbować następujących rozwiązań:
#! /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)