蟒蛇“setdefault”的替代增强了赋值

时间:2012-05-23 11:32:55

标签: python dictionary defaultdict 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

由于一个错误,我收到了“SyntaxError:非法表达式以进行扩充分配”

谷歌搜索给了我这个:

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 个答案:

答案 0 :(得分: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 :(得分: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条件True的结果,可以是FalseCounterTrueFalse"Yes"/"No"的数量保存为字典。它们代表您的{{1}},只是它们是布尔值。

答案 2 :(得分: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让你知道违规代码在哪一行,最好发布至少那段代码。