2012-05-23 56 views
0

我想要一个显示布尔计数的字典。即名称/位置组合符合标准的频率。例如:蟒蛇替代“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

你正在试图为'list'添加一个'int'。你可以更清楚一下你想建立什么样的结构? –

+0

你的分支看起来完全像else分支。这不会让你至少有点紧张吗? ;-) – 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()) 

将采取的关键str(f[1]) + str(f[7])对象从字典psHpGrp,如果它不存在,创建一个新的Counter

然后它会.update([f[6] == 1])它与条件f[6] == 1,其结果可能是TrueFalseCounterTrueFalse的数字作为字典保存。他们代表你的"Yes"/"No",只是他们是布尔人。

3

你想用defaultdict

>>> 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()'然后返回(即这个词典从来没有'KeyError')。 'int()'是'0',你可以测试:) –

0

像@larsmans说,你不能一个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 

另外:你最终错误似乎来自你还没有发布的代码引起的。 Python可以让你知道哪一行是违规代码,最好是至少那行代码。