2013-04-04 13 views
7

sto usando Python dizionari v2.7, uno nidificato all'interno di un altro come questo:Come inizializzare dizionari annidati in Python

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 

sembra un po 'goffo per inizializzare il primo dizionario di livello con un dizionario vuoto prima inserito nel dizionario di secondo livello. C'è un modo per impostare un valore e allo stesso tempo creare un dizionario al primo livello se non ce n'è uno già lì? Immagino che qualcosa di simile a questo per evitare l'inizializzazione condizionale:

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) 

Inoltre, che cosa se il dict interna dovrebbe stesso inizializzare a un elenco?

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) 

risposta

12

Uso setdefault:

Se chiave è nel dizionario, restituire il suo valore. In caso contrario, inserire la chiave con un valore predefinito e restituire il valore predefinito.

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

 

O collections.defaultdict:

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

Con le liste nella dict interno:

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) 

o

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) 

Per dicts di profondità sconosciuta, è possibile utilizzare questo piccolo trucco:

tree = lambda: defaultdict(tree) 

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

C'è qualcosa come defaultdict per gli elenchi nel caso di dettatura interna? – WilliamKF

+0

Stavo semplicemente modificando quello in. Hai solo bisogno di una funzione che restituisce 'defaultdict (list)' e non solo '{}' per le chiavi mancanti. –

3
from collections import defaultdict 
format_to_year_to_value_dict = defaultdict(dict) 

Questo creerà un dizionario che chiama dict() quando si chiavi di accesso che don' Esistono

Problemi correlati