"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' 对象不可迭代

这是怎么回事?

你想用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
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

然后它将.update([f[6] == 1])条件的结果 f[6] == 1 ,可以是 TrueFalse .然后Counter保存 True s 和 False s 的数量作为字典。它们代表你的"Yes"/"No",只是它们是布尔值。

就像@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 让你知道有问题的代码在哪一行,最好至少发布那行代码。

最新更新