[Python] पायथन: डिफ़ॉल्ट डिक्शन का डिफ़ॉल्ट डिक्ट?



Answers

डिफॉल्टडिक्ट कन्स्ट्रक्टर का पैरामीटर वह फ़ंक्शन है जिसे नए तत्व बनाने के लिए बुलाया जाएगा। तो चलो एक लैम्ब्डा का उपयोग करें!

>>> from collections import defaultdict
>>> d = defaultdict(lambda : defaultdict(int))
>>> print d[0]
defaultdict(<type 'int'>, {})
>>> print d[0]["x"]
0

पाइथन 2.7 के बाद, काउंटर का उपयोग करके एक बेहतर समाधान भी है :

>>> from collections import Counter
>>> c = Counter()
>>> c["goodbye"]+=1
>>> c["and thank you"]=42
>>> c["for the fish"]-=5
>>> c
Counter({'and thank you': 42, 'goodbye': 1, 'for the fish': -5})

कुछ बोनस विशेषताएं

>>> c.most_common()[:2]
[('and thank you', 42), ('goodbye', 1)]

अधिक जानकारी के लिए PyMOTW - संग्रह - कंटेनर डेटा प्रकार और पायथन दस्तावेज़ीकरण - संग्रह देखें

Question

क्या निम्न कोड काम करने के लिए defaultdict(defaultdict(int)) का कोई तरीका है?

for x in stuff:
    d[x.a][x.b] += x.c_int

xa और xb तत्वों के आधार पर d को एड-हाॉक बनाया जाना चाहिए।

मैं इस्तेमाल कर सकता हूँ:

for x in stuff:
    d[x.a,x.b] += x.c_int

लेकिन तब मैं उपयोग करने में सक्षम नहीं होगा:

d.keys()
d[x.a].keys()



दूसरों ने सही तरीके से उत्तर दिया है कि काम करने के लिए निम्नलिखित कैसे प्राप्त करें:

for x in stuff:
    d[x.a][x.b] += x.c_int

कुंजी के लिए tuples का उपयोग करने के लिए एक विकल्प होगा:

d = defaultdict(int)
for x in stuff:
    d[x.a,x.b] += x.c_int
    # ^^^^^^^ tuple key

इस दृष्टिकोण के बारे में अच्छी बात यह है कि यह आसान है और आसानी से विस्तार किया जा सकता है। यदि आपको तीन स्तरों के गहरे मैपिंग की आवश्यकता है, तो कुंजी के लिए केवल तीन आइटम टुपल का उपयोग करें।




Links