2013-10-29 2 views
1

다음 코드를 사용하여 사전을 만들려고합니다. D = {}튜플을 파이썬 사전 키 값으로 할당 및 수정

그래서 기본적으로 여기
for item in H: 
    if not item[0] in d: 
     d[item[0]]=(0,0) 
    d[item[0]][0]+=1 
    d[item[0]][1]+=item[1] 

, 나는 키가 사전에없는 경우는 튜플 (0,0)에 키 값을 동일시하는 것 같은 사전을 원하고 키가 나타날 때마다 터플의 두 번째 요소에 키가 나타날 때마다 터플의 첫 번째 요소에 1을 추가하고 정수인 항목 [1]을 터플의 두 번째 요소에 추가하여 튜플의 요소를 적절히 수정합니다. 그대로 코드가 작동하지 않습니다. 어떤 아이디어이 고정 될 수 있는지에 관해서는?

감사합니다, Junaid

답변

1

튜플은 IMM됩니다 유능한, 그래서 영원히 작동하지 않습니다. 즉, 생성 한 후에는 수정할 수 없다는 것을 의미하므로 전체 값을 새 튜플로 바꿔야합니다.

defaultdict을 사용하면 초기 값 설정을보다 우아하게 처리 할 수 ​​있습니다.

1
... 나는 암시가 collections.Counter 당신이 여기 달성하려고하는 무엇이든을 위해 더 적당한 데이터 구조가 될 것입니다,하지만 당신은 약간에게 사용 사례 나에게 계속 더 많은 것을 설명해야합니다

파이썬 튜플 (예 : (0,0))은 변경 불가능합니다. 업데이트 할 수 없습니다. d[item[0]] = [0, 0]으로 대체하면 목록을 사용하고 작동하게 할 수 있습니다.

1

다른 사람들이 말했듯이 tuple은 변경 불가능한 데이터 유형입니다.

In [20]: a = (0,0) 

In [21]: a[0]+=1 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
/home/xxx/<ipython-input-21-394ba21d2aec> in <module>() 
----> 1 a[0]+=1 

TypeError: 'tuple' object does not support item assignment 

그래서, 당신은 당신의 값이 [0,0]에 초기화 된 list,되고 싶어요. defaultdict을 사용하여 다소 컴팩트 한 방법으로 해결할 수 있습니다.

from collections import defaultdict 

d = defaultdict(lambda:[0,0]) 
#d['key'][0] += 1 
#etc