2013-04-04 8 views
7

ich Python v2.7 Wörterbücher bin mit verschachtelten ineinander wie folgt aus:Wie verschachtelte Wörterbücher in Python initialisieren

def example(format_str, year, value): 
    format_to_year_to_value_dict = {} 
    # In the actual code there are many format_str and year values, 
    # not just the one inserted here. 
    if not format_str in format_to_year_to_value_dict: 
    format_to_year_to_value_dict[format_str] = {} 
    format_to_year_to_value_dict[format_str][year] = value 

Es scheint ein wenig ungeschickt die erste Ebene Wörterbuch mit einem leeren Wörterbuch zu initialisieren, bevor eingefügt in das Wörterbuch der zweiten Ebene. Gibt es eine Möglichkeit, einen Wert festzulegen und gleichzeitig ein Wörterbuch auf der ersten Ebene zu erstellen, wenn dort noch kein Wörterbuch vorhanden ist? Ich stelle mir so etwas wie dies die bedingte initializer zu vermeiden:

def example(format_str, year, value): 
    format_to_year_to_value_dict = {} 
    add_dict_value(format_to_year_to_value_dict[format_str], year, value) 

Auch was ist, wenn der innere dict sollte sich auf eine Liste initialisieren?

def example(format_str, year, value): 
    format_to_year_to_value_dict = {} 
    # In the actual code there are many format_str and year values, 
    # not just the one inserted here. 
    if not format_str in format_to_year_to_value_dict: 
    format_to_year_to_value_dict[format_str] = {} 
    if not year in format_to_year_to_value_dict[format_str]: 
    format_to_year_to_value_dict[format_str][year] = [] 
    format_to_year_to_value_dict[format_str][year].append(value) 

Antwort

12

Verwendung setdefault:

Wenn Schlüssel im Wörterbuch enthalten ist, dessen Wert zurück. Ist dies nicht der Fall, geben Sie den Schlüssel mit dem Standardwert ein und geben Sie den Standardwert zurück.

format_to_year_to_value_dict.setdefault(format_str, {})[year] = value 

 

Oder collections.defaultdict:

format_to_year_to_value_dict = defaultdict(dict) 
... 
format_to_year_to_value_dict[format_str][year] = value 

Mit Listen im inneren dict:

def example(format_str, year, value): 
    format_to_year_to_value_dict = {} 

    format_to_year_to_value_dict.setdefault(format_str, {}).setdefault(year, []).append(value) 

oder

def example(format_str, year, value): 
    format_to_year_to_value_dict = defaultdict(lambda: defaultdict(list)) 

    format_to_year_to_value_dict[format_str][year].append(value) 

Für dicts unbekannter Tiefe, können Sie diesen kleinen Trick:

tree = lambda: defaultdict(tree) 

my_tree = tree() 
my_tree['a']['b']['c']['d']['e'] = 'whatever' 
+0

Gibt es etwas wie defaultdict für die Listen im inneren dict-Fall? – WilliamKF

+0

War nur das Bearbeiten in. Sie brauchen nur eine Funktion, die 'defaultdict (list)' und nicht nur '{}' für fehlende Schlüssel zurückgibt. –

3
from collections import defaultdict 
format_to_year_to_value_dict = defaultdict(dict) 

Dieses ein Wörterbuch wird erstellen, die dict(), wenn Sie Zugriffsschlüssel, die don ruft‘ t existieren.

Verwandte Themen