2013-04-04 12 views
7

Używam Python słowniki v2.7, zagnieżdżona wewnątrz jednego innego tak:Jak zainicjować zagnieżdżonych słowniki w Pythonie

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 

Wydaje się nieco niezdarny zainicjować słownika pierwszego stopnia z pustym przed słowniku wstawiony do słownika drugiego poziomu. Czy istnieje sposób na ustawienie wartości przy jednoczesnym tworzeniu słownika na pierwszym poziomie, jeśli już go nie ma? Wyobrażam sobie coś takiego, aby uniknąć inicjator Warunkowo:

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) 

Ponadto, co jeśli wewnętrzna DICT powinna sama zainicjować na liście?

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) 

Odpowiedz

12

Zastosowanie setdefault:

Jeśli klucz jest w słowniku, zwraca jego wartość. Jeśli nie, wstaw klucz o wartości domyślnej i zwróć wartość domyślną.

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

 

Albo collections.defaultdict:

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

z listami w wewnętrznej 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) 

lub

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) 

Dla dicts o nieznanej głębokości, można użyć ten mały trick:

tree = lambda: defaultdict(tree) 

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

Czy istnieje coś takiego jak defaultdict dla list w wewnętrznej sprawie dict? – WilliamKF

+0

Właśnie to edytowałem. Potrzebujesz tylko funkcji, która zwraca 'defaultdict (list)', a nie tylko '{}' dla brakujących kluczy. –

3
from collections import defaultdict 
format_to_year_to_value_dict = defaultdict(dict) 

Spowoduje to utworzenie słownika, który wywołuje dict() kiedy wy klawisze dostępu, które don” t istnieje.