import collections
a = collections.defaultdict(lambda: 3)
a.update({'one':1,'two':2})
print a['three']
का उत्सर्जन करता है 3
के रूप में आवश्यक है करने के लिए नहीं है। तुम भी अपने आप को dict
उपवर्ग सकता है और __missing__
ओवरराइड, लेकिन वह ज्यादा मतलब नहीं है जब defaultdict
व्यवहार (सटीक लापता महत्वपूर्ण यह है कि ऊपर देखा जा रहा है अनदेखी) आप इतनी अच्छी तरह से सूट ...
संपादित ... जब तक, यानी, आप a
के बारे में चिंतित हैं, जब भी आप एक लापता कुंजी (जो defaultdict
के अर्थशास्त्र का हिस्सा है) को देखते हैं और धीमे व्यवहार को प्राप्त करते हैं लेकिन कुछ स्मृति को बचाते हैं। उदाहरण के लिए, स्मृति के मामले में ...:
>>> import sys
>>> a = collections.defaultdict(lambda: 'blah')
>>> print len(a), sys.getsizeof(a)
0 140
>>> for i in xrange(99): _ = a[i]
...
>>> print len(a), sys.getsizeof(a)
99 6284
... defaultdict, मूल रूप से खाली है, अब 99 पहले से लापता कुंजी है कि हम ऊपर देखा है, और 6284 बाइट्स (बनाम 140 बाइट्स लेता है यह खाली होने पर लिया गया)।
वैकल्पिक दृष्टिकोण ...:
>>> class mydict(dict):
... def __missing__(self, key): return 3
...
>>> a = mydict()
>>> print len(a), sys.getsizeof(a)
0 140
>>> for i in xrange(99): _ = a[i]
...
>>> print len(a), sys.getsizeof(a)
0 140
... पूरी तरह से इस स्मृति ओवरहेड सुरक्षित रहता है, जैसा कि आप देख सकते है। ,
$ python -mtimeit -s'import collections; a=collections.defaultdict(int); r=xrange(99)' 'for i in r: _=a[i]'
100000 loops, best of 3: 14.9 usec per loop
$ python -mtimeit -s'class mydict(dict):
> def __missing__(self, key): return 0
> ' -s'a=mydict(); r=xrange(99)' 'for i in r: _=a[i]'
10000 loops, best of 3: 92.9 usec per loop
defaultdict
के बाद से (पहले-लापता) देखने पर कुंजी कहते हैं यह बहुत तेजी से जब इस तरह के एक महत्वपूर्ण अगले ऊपर देखा है mydict
(जो __missing__
ओवरराइड करता है कि से बचने के लिए, जबकि हो जाता है,: बेशक, प्रदर्शन एक और मुद्दा है इसके अलावा) हर बार "लापता कुंजी लुकअप ओवरहेड" का भुगतान करता है।
आप या तो इस मुद्दे (बनाम स्मृति पदचिह्न प्रदर्शन) के बारे में परवाह है या नहीं पूरी तरह से निश्चित रूप से, अपने विशिष्ट उपयोग के पर निर्भर करता है। यह किसी भी मामले में एक अच्छा विचार तालमेल के बारे में पता होना करने के लिए है -)
'collections.defaultdict' आपकी बैटरी-शामिल समाधान है। –
प्रश्न शीर्षक के लिए +1 –