2013-04-04 4 views
7

में मैं v2.7 अजगर शब्दकोशों, इस तरह एक के अंदर नेस्टेड एक उपयोग कर रहा हूँ:नेस्टेड शब्दकोशों प्रारंभ करने में कैसे अजगर

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 

यह एक खाली शब्दकोश से पहले साथ प्रथम स्तर शब्दकोश प्रारंभ करने में थोड़ा अनाड़ी लगता है दूसरे स्तर के शब्दकोश में डाला गया। क्या एक मूल्य निर्धारित करने का कोई तरीका है जबकि एक ही समय में पहले स्तर पर एक शब्दकोश बनाना है यदि कोई पहले से मौजूद नहीं है? मैं कल्पना सशर्त प्रारंभकर्ता से बचने के लिए कुछ इस तरह:

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) 

इसके अलावा, क्या भीतरी dict अपने आप में एक सूची में प्रारंभ चाहिए?

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) 

उत्तर

12

उपयोग setdefault:

तो कुंजी शब्दकोश में है, अपने मूल्य वापसी। यदि नहीं, तो डिफ़ॉल्ट के मान के साथ कुंजी डालें और डिफ़ॉल्ट लौटाएं।

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

 

या collections.defaultdict:

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

भीतरी 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) 

या

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) 

अज्ञात गहराई का dicts के लिए, आप इस छोटे चाल का उपयोग कर सकते हैं:

tree = lambda: defaultdict(tree) 

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

क्या आंतरिक नियम के मामले में सूचियों के लिए डिफ़ॉल्ट डिफॉल्ट की तरह कुछ भी है? – WilliamKF

+0

बस उसमें संपादन कर रहा था। आपको केवल एक फ़ंक्शन की आवश्यकता है जो 'डिफॉल्टडिक्ट (सूची)' लौटाता है और न कि '{} 'गायब कुंजी के लिए। –

3
from collections import defaultdict 
format_to_year_to_value_dict = defaultdict(dict) 

यह एक शब्दकोश है कि dict() कॉल पैदा करेगा जब आप पहुँच कुंजी है कि डॉन ' टी मौजूद नहीं है।

संबंधित मुद्दे