2012-05-23 3 views
0

나는 부울 카운트를 나타내는 사전을 원한다. 나는. 얼마나 자주 이름/위치 조합이 기준을 충족시키는 지. 예 :pythons "setdefault"확장 할당에 대한 대안

Key - Value1 - Value2 
John12 Yes:300 No:25 
John13 Yes:400 No:29 
Linda13 Yes:300 No:60 

은 ...

나는이 시도 : "증강 과제에 대한 불법 표현 구문 에러를"

그래서 준 인터넷 검색

if str(f[1]) + str(f[7]) in psHpGrp: 
    if f[6] == 1: 
     psHpGrp.setdefault(str(f[1]) + str(f[7]), []) +=1 

그리고 버그 내가 가지고 있기 때문에

나 :

if str(f[1]) + str(f[7]) in psHpGrp: 
    if f[6] == 1: 
     i = psHpGrp.setdefault((f[1]) + str(f[7]), []) 
     i += 1  
    else: 
     j = psHpGrp.setdefault((f[1]) + str(f[7]), []) 
     j += 1 
else: 
    psHpGrp.setdefault(str(f[1]) + str(f[7]), []).append(str(f[1]) + str(f[7]))  

그리고 지금 얻었습니다 : j + = 1 'int'객체가 반복 가능하지 않습니다

뭐가 잘못 되었나요?

+3

'목록'에 'int'를 추가하려고합니다. 어떤 종류의 건축물을 만들고 싶은지 조금 더 명확히 해 주실 수 있습니까? –

+0

then-branch는 else-branch와 똑같은 모양입니다. 그게 당신을 최소한 긴장하게 만들지 않을까요? ;-) – Alfe

+0

네, 어떤 recomendations? – AWE

답변

0
from collections import Counter 

psHpGrp.setdefault(str(f[1]) + str(f[7]), Counter()).update([f[6] == 1]) 

첫 부분 :

psHpGrp.setdefault(str(f[1]) + str(f[7]), Counter()) 

가 사전 psHpGrp에서 키 str(f[1]) + str(f[7])위한 목적을 가지고이 존재하지 않는 경우, 새로운 Counter을 생성한다.

그런 다음 f[6] == 1 조건의 결과는 True 또는 False이 될 .update([f[6] == 1])입니다. CounterTrueFalse을 사전으로 보유합니다. 그들은 당신의 "Yes"/"No"을 대변합니다, 그들은 단지 불법입니다.

3

당신은 defaultdict를 사용하려면 : @larsmans 말했다

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> d['a'] += 1 
>>> d['b'] += 1 
>>> d['b'] += 1 
>>> print d['a'], d['b'], d['c'] 
1 2 0 
+1

'defaultdict'는 특정 클래스 (이 경우'int')로 인스턴스화됩니다. 사전에없는 키를 검색하면, 먼저'defaultclass()'로 초기화 된 다음 반환됩니다 (즉,이 dict에 대해서는 결코 KeyError가 없습니다). 'int()'는'0'입니다. 테스트 할 수 있습니다 :) –

0

처럼, 당신은 (+= 사용) 목록에 int를 추가 할 수 없습니다. 처음 시도 할 때 []0으로 바꾼 다음 해당 항목의 번호를 증가시킵니다.

if str(f[1]) + str(f[7]) in psHpGrp: 
    if f[6] == 1: 
     psHpKey = str(f[1]) + str(f[7]) 
     psHpGrp.setdefault(psHpKey, 0) 
     psHpGrp.setdefault[psHpKey] +=1 

또한 : 귀하의 마지막 오류는 게시하지 않은 코드에서 발생하는 것으로 보인다. 파이썬은 문제가되는 코드가 어떤 행인지 알 수 있습니다. 적어도 코드 줄을 개 게시하는 것이 가장 좋습니다.