दिलचस्प पोस्ट
कैसे एक JVM टाइमज़ोन को ठीक से सेट करें Google मानचित्र रिलीज एपीआई कुंजी उत्पन्न करना स्ट्रीम क्यों करता है <टी> अस्थिर <T> लागू नहीं? एचटीएमएल 5 कैनवास आकार (डाउनस्केल) छवि उच्च गुणवत्ता? उपयोगकर्ता-परिभाषित लिखे शब्द नई क्षमताओं को C ++ में जोड़ते हैं? JSONObject – एक मान कैसे प्राप्त करें? मैं PHP में लिखे गए कोड की गति कैसे माप सकता हूँ? एएसपी.नेट अपडेटपैनेल में ग्रिडव्यू जेक्जरी डेमेक्चर वर्तमान कर्सर स्थिति प्राप्त करें एनजी-शो / -हाइड के वैकल्पिक या डोम के केवल प्रासंगिक अनुभाग लोड करने के लिए फ्रेगमेंट में एंड्रॉइड विकल्प मेनू विस्फोट में पीएचपी कई सीमांकक टी-एसक्यूएल डेटाटाइम फ़ंक्शन का उपयोग करने के साथ निकटतम मिनट और निकटतम घंटे तक गोल करता है निर्भर विधि प्रकारों के लिए कुछ सम्मोहक उपयोग के मामले क्या हैं? जावा हैशम कैसे एक ही हैश कोड के साथ विभिन्न वस्तुओं को संभालता है?

संग्रह कैसे करता है।

मैंने अजगर डॉक्स के उदाहरणों को पढ़ा है, लेकिन फिर भी यह पता नहीं लगाया जा सकता कि इस विधि का अर्थ क्या है। क्या कोई मदद कर सकता है? अजगर डॉक्स के दो उदाहरण यहां दिए गए हैं

>>> from collections import defaultdict >>> s = 'mississippi' >>> d = defaultdict(int) >>> for k in s: ... d[k] += 1 ... >>> d.items() [('i', 4), ('p', 2), ('s', 4), ('m', 1)] 

तथा

 >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] >>> d = defaultdict(list) >>> for k, v in s: ... d[k].append(v) ... >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] 

मापदंडों int और list क्या हैं?

वेब के समाधान से एकत्रित समाधान "संग्रह कैसे करता है।"

आमतौर पर, एक पायथन डिक्शनरी में एक कुंजी KeyError फेंकता है, यदि आप एक ऐसी कुंजी के साथ एक आइटम प्राप्त करने का प्रयास करते हैं जो वर्तमान में शब्दकोश में नहीं है इसके विपरीत में defaultdict केवल उन वस्तुओं को बनाएगा जो आप तक पहुंचने का प्रयास करेंगे (बेशक वे अभी तक मौजूद नहीं हैं)। इस तरह के एक "डिफ़ॉल्ट" वस्तु बनाने के लिए, यह फ़ंक्शन ऑब्जेक्ट जिसे आप कन्स्ट्रक्टर में पास करते हैं (अधिक सटीक, यह एक मनमाना "कॉल करने योग्य" ऑब्जेक्ट है, जिसमें फ़ंक्शन और टाइप ऑब्जेक्ट शामिल हैं)। पहला उदाहरण के लिए, डिफ़ॉल्ट आइटम int() का उपयोग कर बनाया जाता है, जो पूर्णांक ऑब्जेक्ट 0 को वापस करेगा। दूसरे उदाहरण के लिए, list() का उपयोग करके डिफ़ॉल्ट आइटम बनाए जाते हैं, जो एक नया खाली सूची ऑब्जेक्ट देता है।

defaultdict मतलब है कि यदि कोई कुंजी शब्दकोश में नहीं मिलती है, तो एक KeyError को फेंकने के बजाय, एक नई प्रविष्टि बनाई जाती है। इस नई प्रविष्टि का प्रकार defaultdict के तर्क से दिया गया है।

उदाहरण के लिए:

 somedict = {} print(somedict[3]) # KeyError someddict = defaultdict(int) print(someddict[3]) # print int(), thus 0 

defaultdict

"मानक शब्दकोष में मूल्य को प्राप्त करने और डिफ़ॉल्ट स्थापित करने के लिए विधि सेटडेफ़ाल्ट () शामिल होता है यदि मूल्य मौजूद नहीं होता है। इसके विपरीत, defaultdict से कॉलर डिफ़ॉल्ट को निर्दिष्ट करता है (मान वापस लौटाया जा सकता है) जब कंटेनर आरंभ किया जाता है।"

उदाहरण के तौर पर पायथॉन स्टैंडर्ड लाइब्रेरी में डग हेलमैन द्वारा परिभाषित

डिफॉल्ट डिक्ट का उपयोग कैसे करें

आयात डिफ़ॉल्ट

 >>> from collections import defaultdict 

डिफ़ॉल्ट का आरंभ करें

इसे पारित करके शुरु करें

अपनी पहली तर्क के रूप में योग्य (अनिवार्य)

 >>> d_int = defaultdict(int) >>> d_list = defaultdict(list) >>> def foo(): ... return 'default value' ... >>> d_foo = defaultdict(foo) >>> d_int defaultdict(<type 'int'>, {}) >>> d_list defaultdict(<type 'list'>, {}) >>> d_foo defaultdict(<function foo at 0x7f34a0a69578>, {}) 

** इसके दूसरे तर्क के रूप में kwargs (वैकल्पिक)

 >>> d_int = defaultdict(int, a=10, b=12, c=13) >>> d_int defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12}) 

या

 >>> kwargs = {'a':10,'b':12,'c':13} >>> d_int = defaultdict(int, **kwargs) >>> d_int defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12}) 

यह कैसे काम करता है

जैसा कि मानक शब्दकोश का एक बच्चा वर्ग है, यह सभी एक ही कार्य कर सकता है

लेकिन एक अज्ञात कुंजी पास करने के मामले में त्रुटि के बजाय डिफ़ॉल्ट मान देता है पूर्व के लिए:

 >>> d_int['a'] 10 >>> d_int['d'] 0 >>> d_int defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0}) 

यदि आप डिफ़ॉल्ट मान को बदलना चाहते हैं तो डिफ़ॉल्ट_निचर पर अधिलेखित करें:

 >>> d_int.default_factory = lambda: 1 >>> d_int['e'] 1 >>> d_int defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0}) 

या

 >>> def foo(): ... return 2 >>> d_int.default_factory = foo >>> d_int['f'] 2 >>> d_int defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2}) 

प्रश्न में उदाहरण

उदाहरण 1

चूंकि int को default_factory के रूप में पारित किया गया है, किसी भी अज्ञात कुंजी डिफ़ॉल्ट रूप से 0 लौटाएगा।

अब जब स्ट्रिंग लूप में पारित हो जाती है, यह डी में उन वर्णों की संख्या में वृद्धि होगी।

 >>> s = 'mississippi' >>> d = defaultdict(int) >>> d.default_factory <type 'int'> >>> for k in s: ... d[k] += 1 >>> d.items() [('i', 4), ('p', 2), ('s', 4), ('m', 1)] >>> d defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1}) 

उदाहरण 2

डिफ़ॉल्ट रूप से एक सूची के रूप में पारित किया गया है, किसी अज्ञात (गैर-मौजूद) कुंजी डिफ़ॉल्ट रूप से [] (यानी सूची) लौटाएगी।

अब जैसे ट्यूपल्स की सूची लूप में पारित हो जाती है, यह डी [रंग] में मूल्य जोड़ देगा

 >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] >>> d = defaultdict(list) >>> d.default_factory <type 'list'> >>> for k, v in s: ... d[k].append(v) >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] >>> d defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]}) 

यहां डिफ़ॉल्ट डिपार्टमेंट के एक महान स्पष्टीकरण है: http://ludovf.net/blog/python-collections-defaultdict/

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

सामान्य शब्दकोशों में, अगर आपके उदाहरण में मैं d[a] कॉल करने की कोशिश करता हूं, तो मुझे एक त्रुटि मिल जाएगी (कुंजीईआरर), चूंकि केवल चाबी m, s, i और p मौजूद हैं और कुंजी को आरम्भ नहीं किया गया है। लेकिन किसी defaultdict में, यह एक तर्क के रूप में एक फ़ंक्शन नाम लेता है, जब आप उस कुंजी का उपयोग करने का प्रयास करते हैं जिसे आरंभ नहीं किया गया है, तो यह केवल उस फ़ंक्शन को कॉल करता है जिसे आप पास करते हैं और इसकी वापसी मूल्य को नए कुंजी के मूल्य के रूप में निर्दिष्ट करते हैं

चूंकि सवाल है "यह कैसे काम करता है" के बारे में है, कुछ पाठकों को अधिक नट और बोल्ट देखना चाहते हैं। विशेष रूप से, सवाल में विधि __missing__(key) विधि है। देखें: https://docs.python.org/2/library/collections.html#defaultdict-objects

और अधिक __missing__(key) से, यह उत्तर दिखाता है कि व्यावहारिक तरीके से __missing__(key) का उपयोग कैसे करें: https://stackoverflow.com/a/17956989/1593924

स्पष्ट करने के लिए कि 'कोलाज' का मतलब क्या है, यह इंटरैक्टिव सत्र है (2.7.6 से, लेकिन इसे वी 3 में भी काम करना चाहिए):

 >>> x = int >>> x <type 'int'> >>> y = int(5) >>> y 5 >>> z = x(5) >>> z 5 >>> from collections import defaultdict >>> dd = defaultdict(int) >>> dd defaultdict(<type 'int'>, {}) >>> dd = defaultdict(x) >>> dd defaultdict(<type 'int'>, {}) >>> dd['a'] 0 >>> dd defaultdict(<type 'int'>, {'a': 0}) 

यह डिफ़ॉल्ट का सबसे सामान्य उपयोग था (एक्स चर के व्यर्थ उपयोग को छोड़कर) आप 0 के साथ एक समान चीज़ को स्पष्ट डिफ़ॉल्ट मान के रूप में कर सकते हैं, लेकिन एक साधारण मूल्य के साथ नहीं:

 >>> dd2 = defaultdict(0) Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> dd2 = defaultdict(0) TypeError: first argument must be callable 

इसके बजाय, निम्नलिखित कार्य इसलिए होते हैं क्योंकि यह एक सरल कार्य में गुजरता है (यह उड़ने पर एक अज्ञात कार्य करता है जिसमें कोई तर्क नहीं होता है और हमेशा 0 देता है):

 >>> dd2 = defaultdict(lambda: 0) >>> dd2 defaultdict(<function <lambda> at 0x02C4C130>, {}) >>> dd2['a'] 0 >>> dd2 defaultdict(<function <lambda> at 0x02C4C130>, {'a': 0}) >>> 

और एक अलग डिफ़ॉल्ट मान के साथ:

 >>> dd3 = defaultdict(lambda: 1) >>> dd3 defaultdict(<function <lambda> at 0x02C4C170>, {}) >>> dd3['a'] 1 >>> dd3 defaultdict(<function <lambda> at 0x02C4C170>, {'a': 1}) >>> 

मेरा अपना 2 ¢: आप डिफ़ॉल्ट को भी कम कर सकते हैं:

 class MyDict(defaultdict): def __missing__(self, key): value = [None, None] self[key] = value return value 

यह बहुत जटिल मामलों के लिए काम में आ सकता है।

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

 import collections def default_factory(): return 'default value' d = collections.defaultdict(default_factory, foo='bar') print 'd:', d print 'foo =>', d['foo'] print 'bar =>', d['bar'] 

यह तब तक अच्छी तरह से काम करता है जब तक सभी कुंजी के लिए समान डिफ़ॉल्ट होने के लिए उपयुक्त हो। यह विशेष रूप से उपयोगी हो सकता है यदि मूलभूत मूल्य एकत्रित या संचित करने के लिए इस्तेमाल किया जाने वाला एक प्रकार है, जैसे कि सूची, सेट या यहां तक ​​कि इंट। मानक पुस्तकालय प्रलेखन में इस तरह की डिफ़ॉल्ट डिस्काउंट का उपयोग करने के कई उदाहरण शामिल हैं।

 $ python collections_defaultdict.py d: defaultdict(<function default_factory at 0x100468c80>, {'foo': 'bar'}) foo => bar bar => default value 

मुझे लगता है कि एक स्विच केस स्टेटमेंट के स्थान पर इसका सबसे अच्छा इस्तेमाल किया गया है। कल्पना कीजिए अगर हमारे पास एक स्विच केस स्टेटमेंट नीचे है:

 option = 1 switch(option) { case 1: print '1st option' case 2: print '2nd option' case 3: print '3rd option' default: return 'No such option' } 

अजगर में कोई switch केस स्टेटमेंट उपलब्ध नहीं है। हम defaultdict का उपयोग करके इसे प्राप्त कर सकते हैं

 from collections import defaultdict def default_value(): return "Default Value" dd = defaultdict(default_value) dd[1] = '1st option' dd[2] = '2nd option' dd[3] = '3rd option' print(dd[4]) print(dd[5]) print(dd[3]) 

यह प्रिंट करता है:

 Default Value Default Value 3rd option 

ऊपर स्निपेट dd में कोई कुंजी 4 या 5 नहीं है और इसलिए यह एक डिफ़ॉल्ट मान प्रिंट करता है जिसे हमने एक सहायक फ़ंक्शन में कॉन्फ़िगर किया है। यह एक कच्ची शब्दकोश से काफी अच्छा है, जहां कुंजी मौजूद नहीं है, तो एक KeyError फेंक दिया जाता है। इस से यह स्पष्ट है कि एक स्विच मामले के बयान की तरह defaultdict जहां हम जटिल if-elif-elif-else ब्लॉकों से बच सकते हैं।

एक और अच्छा उदाहरण जिसने मुझे इस साइट से बहुत प्रभावित किया है:

 >>> from collections import defaultdict >>> food_list = 'spam spam spam spam spam spam eggs spam'.split() >>> food_count = defaultdict(int) # default value of int is 0 >>> for food in food_list: ... food_count[food] += 1 # increment element's value by 1 ... defaultdict(<type 'int'>, {'eggs': 1, 'spam': 7}) >>> 

अगर हम eggs और spam अलावा किसी भी वस्तु का उपयोग करने का प्रयास करते हैं तो हमें 0 की संख्या मिल जाएगी।

दस्तावेज़ीकरण और स्पष्टीकरण बहुत अधिक आत्म व्याख्यात्मक हैं:

http://docs.python.org/library/collections.html#collections.defaultdict

टाइप फ़ंक्शन (int / str आदि) एक तर्क के रूप में पारित किया जाता है जिसका उपयोग किसी भी कुंजी के लिए एक डिफ़ॉल्ट मान को इनिशियलाइज़ करने के लिए किया जाता है जहां कि कुंजी डिक्ट में मौजूद नहीं है