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']}
python
defaultdict
user2988464
źródło
źródło
dict(number_to_letter)
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.
źródło
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ładdefaultdict(int)
lubdefaultdict(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łaszaKeyError
wyjątek (jak błąd, informujący, że nie może znaleźć tego klucza). Ale w adefaultdict
zamiast tego wywołujedefault_factory
funkcję, aby utworzyć nową wartość domyślną (to jest „domyślna” wdefaultdict
) 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
moduleimport 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.
źródło
Jeśli nawet potrzebujesz wersji rekurencyjnej do konwersji rekurencyjnej
defaultdict
na adict
, 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)
źródło
defaultdict(lambda: defaultdict(int))
):{k: dict(v) for k, v in foo.items()}