2011-11-01 1 views
15

collections.defaultdict 위대한입니다. 특히 lambda와 함께 :collections.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__이 예외가 발생하지만, 당신이 서브 클래스에 원하는대로 할 수있는 :

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

전에이 마법 방법에 대해 알고하지 않았다

d = KeyBasedDefaultDict(lambda key: [None] * key) d[1] > [None] d[2] > [None, None] 
, :), 큰 : 질문에 설명

사용으로 –

1

이이 작동합니다. 아마 다른 방법을 오버라이드 (override)하면 해결할 수 있습니다.

class NoneDict(collections.defaultdict): 
    def __setitem__(self, key, value): 
     super(NoneDict, self).__setitem__(key, key*[None]) 
당신은 아마 당신이 DICT에없는 항목에 액세스하려고 할 때마다 dict에서 호출됩니다 __missing__을 원하는
2

SingleNegationEliminationrplntthe 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 동작을 복제해야합니다.

관련 문제