【问题标题】:An alternative to pythons "setdefault" augmented assignmentpython“setdefault”增强赋值的替代方法
【发布时间】:2012-05-23 22:07:39
【问题描述】:

我想要一个显示布尔计数的字典。 IE。姓名/职位组合符合标准的频率。例如:

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' object is not iterable

这里有什么问题?

【问题讨论】:

  • 您正在尝试将int 添加到list。您能否更清楚地了解您要构建什么样的结构?
  • 您的 then-branch 看起来与 else-branch 完全一样。这不是让你至少有点紧张吗? ;-)
  • 是的,有什么推荐吗?

标签: python dictionary defaultdict setdefault


【解决方案1】:

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

【讨论】:

  • 只是为了明确一点:defaultdict 是用某个类实例化的(在这种情况下,int)。如果您检索不在字典中的键,它首先初始化为defaultclass(),然后返回(即,此字典永远不会有KeyError)。 int()0,你可以测试一下 :)
【解决方案2】:
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的结果,可以是TrueFalseCounterTrues 和 Falses 的数量保存为字典。它们代表您的"Yes"/"No",只是它们是布尔值。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-19
      • 2023-03-08
      • 2011-01-17
      • 2017-06-20
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多