2011-11-01 11 views
15

collections.defaultdict बहुत अच्छा है। विशेष रूप से lambda साथ संयोजन के रूप में:संग्रह में कुंजी का उपयोग करना .defaultdict

>>> import collections 
>>> a = collections.defaultdict(lambda : [None,None]) 
>>> a['foo'] 
[None, None] 

वहाँ लैम्ब्डा में कुंजी दी (जैसे 'foo') का उपयोग करने के लिए एक रास्ता है? उदाहरण के लिए (काम नहीं करता है):

>>> a = collections.defaultdict(lambda : [None]*key) 
>>> a[1] 
[None] 
>>> a[2] 
[None, None] 
>>> a 
defaultdict(<function <lambda> at 0x02984170>, {1: [None], 2: [None, None]}) 

उत्तर

30

आप शायद __missing__ जो dict पर कहा जाता है कि जब भी आप किसी आइटम dict में मौजूद नहीं पहुँचने का प्रयास करना चाहते हैं; वेनिला __missing__ एक अपवाद को जन्म देती है, लेकिन आप जो कुछ भी आप एक उपवर्ग में पसंद कर सकता है:

class A(dict): 
    def __missing__(self, key): 
     value = self[key] = [None] * key 
     return value 
+0

इस जादू विधि के बारे में पहले पता नहीं था, :), महान: प्रश्न में वर्णित

प्रयोग के रूप में –

1

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

class NoneDict(collections.defaultdict): 
    def __setitem__(self, key, value): 
     super(NoneDict, self).__setitem__(key, key*[None]) 
2

SingleNegationElimination और rplnt, और the defaultdict documentation से जवाब का मेल, मैं निम्नलिखित समाधान का इस्तेमाल किया।

import collections 
class KeyBasedDefaultDict(collections.defaultdict): 
    def __missing__(self, key): 
     if self.default_factory is None: 
      raise KeyError(key) 
     self[key] = self.default_factory(key) 
     return self[key] 

विधि के शरीर संभवतः सिर्फ return self.default_factory(key) हो सकता है, लेकिन अतिरिक्त कोड सभी defaultdict व्यवहार को दोहराने के लिए यकीन है कि बनाता है।

d = KeyBasedDefaultDict(lambda key: [None] * key) 
d[1] 
> [None] 
d[2] 
> [None, None] 
संबंधित मुद्दे