2012-03-20 5 views
2

사전에 키와 값을 설정하고 싶습니다. 다음은 내가하는 일의 예입니다.파이썬에서 중첩 된 무한 사전

class NestedDict(dict): 
    def __getitem__(self, key): 
     if key in self: return self.get(key) 
     return self.setdefault(key, NestedDict()) 

>>> c = NestedDict() 
>>> c 
{} 
>>> c['a']['b'] = 'test' 
>>> c['a']['c'] = 2 
>>> c 
{'a': {'c': 2, 'b': 'test'}} 
>>> c['a']['c'] += 1 
>>> c 
{'a': {'c': 3, 'b': 'test'}} 
>>> c['a']['d'] += 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +=: 'NestedDict' and 'int' 

어떤 아이디어로이 문제를 해결할 수 있습니까? + = 및 - =를 사용할 수 있기를 바랍니다. 물론 가치가 존재하지 않는다면 + = 1은 1과 동일합니다. 아마도 더 나은 해결책이 있을까요?

감사합니다.

+0

, 그래서 당신은 그것을 시작하고 뭔가를 증가합니다. 'c [someNonExistingKey] + = 1'라고 쓸 때 – lpostula

+2

을 원하는대로 할 수 있습니다. 원하는 결과는 무엇입니까? – georg

+0

알아요,하지만 값이 없으면 자동으로 0을 설정하고 + = – eshlox

답변

1

중첩 된 dict 내부에 배치 된 객체를 제어 할 수 있으므로 객체에 추가 할 때 단순히 다른 객체를 반환하는 방식으로 추가 및 뺄셈을 정의하기 만하면됩니다 (효과가 더해지면 0으로 동작 함). 번호) :

class NestedDict(dict): 
    def __getitem__(self, key): 
     if key in self: return self.get(key) 
     return self.setdefault(key, NestedDict()) 
    def __add__(self, other): 
     return other 
    def __sub__(self, other): 
     return other 

봐라은 :

당신의 C는 [ 'A'] [ 'D'] 값이 없기 때문에 그것의
>>> n = NestedDict() 
>>> n["a"]["b"] += 1 
>>> n["a"]["b"] 
1 
+0

완벽한 내용도 참조하십시오. 정확히 내가 원했던 것. 고맙습니다. – eshlox

10

dc['a']에 존재하지 않으므로 1을 추가하려고하면 어떤 종류의 동작이 필요합니까? 먼저 __getitem__을 호출하고 키를 찾지 않은 다음 int을 추가하여 지원하지 않는 NestedDict을 반환합니다.

"기본"값으로 사전을 구현하려고하는 것처럼 보입니다. 나는 모든 너무

from collections import defaultdict 

def create_nested_dict(): 
    return defaultdict(create_nested_dict) 

c = create_nested_dict() 
1

처음처럼 수집 모듈에서 사용할 수있는 defaultdict 클래스를 사용하는 것이, setdefault() 이미 존재하는 경우, 당신은 당신의 __getitem__()의 첫 번째 줄 필요하지 않습니다 self[key]를 반환합니다.

문제는 해결할 수 없습니다. 적어도 기존 코드는 사용하지 마십시오. 존재하지 않는 모든 노드에 대해 이미 NestedDict를 작성 중입니다. 이제 그들 중 일부가 숫자가되기를 원하십니까?

아마도 필요에 따라 dict 또는 숫자로 작동 할 수있는 동적 노드 클래스를 만들어야할까요?

관련 문제