2012-01-23 2 views
2

나는 파이썬에서 사전과 비슷한 데이터 구조를 찾고있다. 차이점은 키가 두 개인다는 것입니다. 나는 일정한 시간에 값에 접근 할 수 있기를 원한다. Like :키가 두 값인 사전과 비슷한 파이썬 데이터 구조?

dict.get(dog, smurf) 
{(dog, smurf): 40} 

이게 가능합니까?

이것이 없으면 사전으로 사전을 작성합니다. 그러나 위의 방법이 더 편리 할 것입니다.

{dog: {(smurf: 40)}} 
+3

몇 가지 의견 : dict'dict'을 호출하지 마십시오. dict.get (dog, smurf)는 파이썬을 'dict else dog in dur else smurf'라고하는 의미로 'dict [dog]'라고 읽는 사람이 해석합니다.이 경우는 당신이 의미하는 바가 아닙니다! – wim

답변

11

무엇이 당신을 멈추게합니까?

d = {(dog, smurf): 40} 
print d[(dog, smurf)] # 40 
+3

와우, 나도 그걸 몰랐어. 아마도 처음 시도했을 것입니다. – egidra

3

내가 오해하지 않는 한, 튜플과 함께 일반 dict 색인을 사용할 수 있습니다. 키가 모두 해시 가능한 경우 (불변) 튜플은 해시 가능하며 dict 키로 사용할 수 있습니다.

>>> d = {('dog', 'smurf'): 123} 
>>> d[('dog', 'smurf')] 
123 
>>> d.get(('dog', 'smurf')) 
123 

당신이 정말 풀고/튜플 포장을 사용하는 것으로, 중복 괄호없이 d.get을 사용하여 다음 dict에서 상속과 get 방법 및/또는 __getitem__을 재정의합니다. 그러나 좋은 이유가 필요하지 않으면 그렇게하지 마십시오.

+0

아, 나는 몰랐다. – egidra

3

나는 귀하의 예를 잘 이해하지 못합니다. 이런 뜻인가요?

>>> dog = 'dog' 
>>> smurf = 'smurf' 
>>> d = {(dog, smurf): 40} 
>>> d[(dog, smurf)] 
40 

튜플은 변경할 수 없으며 포함 된 개체도 불변 인 경우 사전 키로도 사용할 수 있습니다.

하지만 dog에 변경 가능한 객체를 할당하면, 그것은 작동하지 않습니다

>>> dog = ['d', 'o', 'g'] 
>>> d[(dog, smurf)] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 
+0

예, 맞습니다. 나는 그것이 가능하다는 것을 몰랐다. – egidra

3

당신은 괄호가 필요하지 않습니다 :

>>> d = {} 
>>> d['jim', 'joe'] = 7 
>>> d['jim', 'joe'] 
7 
>>> d 
{('jim', 'joe'): 7} 

튜플은 괄호에 의해 표시되지 않습니다. 그들은 쉼표로 표시됩니다. 괄호는 때때로 모호성 제거에만 필요합니다.