2012-11-10 13 views
5

Myślę, że chcę utworzyć słownik 2d z wieloma kluczami na wartość.Słownik 2d z wieloma kluczami na wartość

wiem jak zrobić 2d słowniku używając defaultdict:

from collections import defaultdict 
2d_dict = defaultdict(dict) 

2d_dict['canned_food']['spam'] = 'delicious' 

I wiem, że za pomocą regularnych słowniki można dokonać wielu kluczy jak

dictionary={('food','canned_food'):spam} 

Ale chcę zrobić coś takiego:

2d_dict[('canned_food','food')]['spam'] = 'delicious' 

W pierwszym wymiarze słownika potrzebuję ~ 25 klucze na wartość. Czy jest jakiś sposób na zrobienie tego z defaultdict?

Nawet jeśli jest jakiś sposób na zrobienie tego za pomocą dyktowania, czy jest to rozsądny sposób na stworzenie prostego, wielowymiarowego widoku tabeli?

Odpowiedz

11

Oprócz 2d_dict jest nieprawidłowa nazwa zmiennej (zaczyna się od cyfry), istniejące rozwiązanie już działa:

>>> from collections import defaultdict 
>>> d2_dict = defaultdict(dict) 
>>> d2_dict[('canned_food', 'food')]['spam'] = 'delicious' 
>>> d2_dict 
defaultdict(<type 'dict'>, {('canned_food', 'food'): {'spam': 'delicious'}}) 

W rzeczywistości, nawet nie trzeba nawiasy - Python będzie nadal rozpoznaje klucz jako krotka:

>>> d2_dict['fresh_food', 'food']['eggs'] = 'delicious' 
>>> d2_dict 
defaultdict(<type 'dict'>, {('canned_food', 'food'): {'spam': 'delicious'}, 
('fresh_food', 'food'): {'eggs': 'delicious'}}) 

... i, tak, jest to całkowicie rozsądny sposób na zbudowanie tabeli wyszukiwania 2D + 1D.

Jeśli chcesz zbudować tablicę przeglądową 3D przy użyciu zagnieżdżonych dicts zamiast kluczy krotki, to działa:

>>> d3_dict = defaultdict(lambda: defaultdict(dict)) 
>>> d3_dict['dried_food']['food']['jerky'] = 'chewy' 
>>> d3_dict 
defaultdict(<function <lambda> at 0x7f20af38a2a8>, 
{'dried_food': defaultdict(<type 'dict'>, {'food': {'jerky': 'chewy'}})}) 
+0

Dziękuję, najwyraźniej starał przykład (z obecnie nieprawidłowej nazwy zmiennej) muszę mieć miał literówkę. Masz rację, chociaż to po prostu działa. – Keith

+0

Jak uzyskać dostęp do słownika. Pomyślałem: 'print d2_dict ['fresh_food'] ['eggs']' wypisze pysznie, ale pojawi się błąd. Jeśli używam słownika bez listy, działa dobrze. Czy muszę zrobić coś specjalnego, aby uzyskać dostęp do dyktatury? – Keith

+0

''fresh_food'' nie jest kluczem w słowniku najwyższego poziomu -' (' fresh_food ',' food ') 'is. Więc użyjesz 'print d2_dict ['fresh_food', 'food'] ['eggs']'. –

Powiązane problemy