2015-05-20 6 views
15

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

कोड के रूप में नीचे है:

from collections import defaultdict 
def sort_colors(A): 
    ht = {}      # a hash map 
    ht = defaultdict(lambda:0, ht) # with default value 1 
    for i in A: 
     ht[i] += 1 
    ret = [] 
    for k in [0, 1, 2]: 
     ret.extend([k]*ht[k]) 
    return ret 

समारोह के पहले दो लाइनों में रूप में, यह

ht = {} 
ht = defaultdict(lambda:0, ht) 

है मैं इस तुम कृपया मुझे आंकड़ा मदद initialization.Could के बारे में काफी स्पष्ट नहीं कर रहा हूँ यह बाहर? और, क्या हम इन दो पंक्तियों को निम्नलिखित के साथ बदल देंगे? जब आप एक कुंजी मौजूद नहीं है कि के साथ एक नियमित dict तक पहुँचने का प्रयास

ht = defaultdict(int) # default value 0 
+3

रिटर्न जब तक आप संग्रह से आयात कर रहे हैं, साथ ही सिर्फ एक 'Counter' उपयोग कर सकते हैं। – Kevin

+2

डिफ़ॉल्ट मान वहाँ नहीं है 1, यह 0. –

+2

कोशिश' हिंदुस्तान टाइम्स = defaultdict (लैम्ब्डा है : 1) # डिफ़ॉल्ट मान 1' के साथ और हटाएं पिछली पंक्ति में 'ht' के मान को बदलने के बाद से पहले 'ht = {}' जो कुछ भी पूरा नहीं करता है। – martineau

उत्तर

16
ht = {} 
ht = defaultdict(lambda:0, ht) 

defaultdict कि में dict से अलग हैं, यह एक KeyError को जन्म देती है।
defaultdict, हालांकि, कोई त्रुटि नहीं उठाती है: यह आपके लिए कुंजी बनाता है। किस मूल्य के साथ? callabe की वापसी के साथ आप एक तर्क के रूप में पारित किया। इस मामले में, प्रत्येक नई कुंजी मूल्य 0 (जो कि सरल lambda फ़ंक्शन lambda:0) की वापसी है, जो int() की समान वापसी होती है, इसलिए में यह मामला में कोई अंतर नहीं होगा डिफ़ॉल्ट फ़ंक्शन को int() पर बदलना।

और अधिक विस्तार में इस लाइन का विश्लेषण करना: ht = defaultdict(lambda:0, ht)

पहला तर्क एक समारोह है, जो एक प्रतिदेय वस्तु है। यह वह कार्य है जिसे एक अनन्य कुंजी के लिए एक नया मान बनाने के लिए बुलाया जाएगा। दूसरा तर्क, ht वैकल्पिक है और मूल शब्दकोश को संदर्भित करता है कि नया defaultdict बनाया जाएगा। इसलिए, यदि ht में कुछ कुंजी और मान थे, तो defaultdict में इन चाबियाँ भी संबंधित मानों के साथ होंगी। यदि आपने इन चाबियों तक पहुंचने का प्रयास किया है, तो आपको पुराने मान मिलेंगे। हालांकि, यदि आप बेस डिक्शनरी पास नहीं करते हैं, तो एक नया नया defaultdict बनाया जाएगा, और इस प्रकार, एक्सेस की गई सभी नई कुंजियों को कॉल करने योग्य से डिफ़ॉल्ट मान वापस किया जाएगा।
(इस मामले में, के रूप में ht शुरू में एक खाली dict है, वहाँ कोई अंतर बिल्कुल ht = defaultdict(lambda:0), ht = defaultdict(int) या ht = defaultdict(lambda:0, ht) करने में होगा: वे सभी एक ही defaultdict का निर्माण होगा

+0

(लैम्ब्डा: 0, एचटी) सिर्फ 0 के साथ कॉल करने योग्य है? – chancyWu

+0

यह सही है। मैंने पोस्ट को इसे और अधिक विस्तार से तोड़ने के लिए संपादित किया – RafaelC

+0

यह दिलचस्प है! मैं ऐसी अवधारणाओं को कहां से सीख सकता हूं? –

25

मुझे लगता है कि तुम सिर्फ एक लैम्ब्डा पारित कर सकते हैं। समारोह है कि 1

d = defaultdict(lambda:1) 
+3

यह सही है। स्वीकृत उत्तर नहीं। – jimh

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