2012-11-10 7 views
5

Ich denke, ich möchte ein 2d-Wörterbuch mit mehreren Schlüsseln pro Wert machen.2D Wörterbuch mit mehreren Schlüsseln pro Wert

Ich weiß, wie ein 2D-Wörterbuch defaultdict mit machen:

from collections import defaultdict 
2d_dict = defaultdict(dict) 

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

Und ich weiß, dass regelmäßige Wörterbücher verwenden Sie etwas mehrere Tasten wie

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

Aber ich möchte tun machen, wie:

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

In der ersten Dimension des Wörterbuchs brauche ich ~ 25 Schlüssel pro Wert. Gibt es eine Möglichkeit, dies mit defaultdict zu tun?

Auch wenn es einen Weg gibt, es mit Dicts zu tun, ist dies ein vernünftiger Weg, um eine einfache multidimensionale Look-Up-Tabelle zu erstellen?

Antwort

11

Neben 2d_dict ein ungültiger Variablenname sein (es beginnt mit einer Ziffer), Ihre bestehende Lösung bereits funktioniert:

>>> 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'}}) 

In der Tat, Sie brauchen nicht einmal die Klammern - Python wird noch erkennen Ihre Schlüssel als Tupel:

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

... und, ja, es ist ein durchaus vernünftiger Weg, um eine 2D + 1D-Lookup-Tabelle zu erstellen.

Wenn Sie eine 3D-Lookup-Tabelle mit verschachtelten dicts statt Tupel Schlüssel zu bauen, das funktioniert:

>>> 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

Danke, hatte ich versuche offensichtlich das Beispiel (mit aus dem ungültigen Variablennamen) Ich muß hatte einen Tippfehler. Du hast Recht, obwohl es nur funktioniert. – Keith

+0

Wie greife ich auf das Wörterbuch zu? Ich dachte: 'print d2_dict ['fresh_food'] ['eggs']' würde sehr gut drucken, aber es kommt mit einem Fehler auf. Wenn ich ein Wörterbuch ohne eine Liste verwende, funktioniert es gut. Muss ich etwas Besonderes tun, um auf das Diktat zugreifen zu können? – Keith

+0

'' fresh_food'' ist kein Schlüssel im Wörterbuch der obersten Ebene - '('fresh_food', 'food')' ist. Du würdest also 'print d2_dict ['fresh_food', 'food'] ['eggs']' 'verwenden. –

Verwandte Themen