2016-07-20 3 views
5

जब अजगर के साथ काम 3 शब्दकोशों, मैं कुछ इस तरह क्या करने वाले रखना:एक शब्दकोश तत्व के मूल्य को मूल रूप से कैसे बढ़ाया जाए?

d=dict() 
if 'k' in d: 
    d['k']+=1 
else: 
    d['k']=0 

मैं वहाँ याद करने के लिए यह करने के लिए एक देशी तरह से किया जा रहा है लगते हैं, लेकिन प्रलेखन के माध्यम से देख रहा था और यह नहीं मिल सका । क्या आपको पता है यह क्या है?

उत्तर

12

यह collections.defaultdict के लिए उपयोग का मामला है, यहां केवल int डिफ़ॉल्ट फैक्ट्री के लिए कॉल करने योग्य का उपयोग कर रहा है।

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> d 
defaultdict(<class 'int'>, {}) 
>>> d['k'] +=1 
>>> d 
defaultdict(<class 'int'>, {'k': 1}) 

एक defaultdict आइटम बनाने के लिए जब भी एक लापता कुंजी की खोज कर रहा है कॉन्फ़िगर किया गया है। आप इसे एक कॉल करने योग्य (यहां int()) प्रदान करते हैं, जो कि जब भी __getitem__ के साथ लुकअप मौजूद होता है तो डिफ़ॉल्ट मान उत्पन्न करने के लिए उपयोग किया जाता है जो मौजूद नहीं है। यह कॉल करने योग्य एक उदाहरण विशेषता में संग्रहीत है जिसे default_factory कहा जाता है।

यदि आप default_factory प्रदान नहीं करते हैं, तो आपको लापता कुंजी के लिए सामान्य रूप से KeyError मिल जाएगा।

तो फिर तुम एक अलग डिफ़ॉल्ट मान चाहता था लगता है, शायद 1 0. के बजाय आप बस एक प्रतिदेय जो आपके इच्छित शुरू करने मूल्य प्रदान करता है पारित करने के लिए, बहुत तुच्छता

>>> d = defaultdict(lambda: 1) 

यह स्पष्ट रूप से भी कर सकते थे होता इस मामले में किसी भी नियमित नामित समारोह हो।


हालांकि यह ध्यान देने योग्य बात है कि यदि आपके मामले में आप सिर्फ विशेष मूल्यों की गिनती स्टोर करने के लिए एक शब्दकोश का उपयोग करने के प्रयास कर रहे हैं, एक collections.Counter काम के लिए अधिक उपयुक्त है लायक है।

>>> from collections import Counter 
>>> Counter('kangaroo') 
Counter({'a': 2, 'o': 2, 'n': 1, 'r': 1, 'k': 1, 'g': 1}) 
0

लें टिप्पणी है कि आप हमेशा एक अभिव्यक्ति में इसका उपयोग करने से if stamemt से अव्यवस्था को दूर कर सकते हैं:

d['k'] = d['k'] + 1 if 'k' in d else 0 
संबंधित मुद्दे