Python:实例数量计数的字典列表理解

时间:2014-12-21 08:05:30

标签: python dictionary

我有以下内容:

a = rand(100).round() #for example
count = {}

for i in a:
    count[i] = count.get(i, 0) + 1

# print(a)
print(count)

最后一行返回{0.0: 52, 1.0: 48}

之类的内容

我想将for循环作为字典理解。但是,

count = {i: count.get(i,0)+1 for i in a}

始终返回{0.0: 1, 1.0: 1}

我做错了什么?

3 个答案:

答案 0 :(得分:3)

为什么不使用名称恰当的Counter

from collections import Counter

>>> c = Counter([1,1,1,1,1,1,1,1,1,1,1,1,5,4,3,2,3,4,1,3,13,12,13,2,1,13,4,4,4])
>>> c
Counter({1: 14, 4: 5, 3: 3, 13: 3, 2: 2, 5: 1, 12: 1})

答案 1 :(得分:2)

声明

count = {i: count.get(i,0)+1 for i in a}

由两部分组成:

{i: count.get(i,0)+1 for i in a}

count = ...

第一个计算字典,在评估字典时count只是您首先定义的空字典,与理解表达式构造的字典无关。

仅在字典构造结束时,将其分配给count(替换空字典)。在理解评估期间,count为空且保持为空,因此每个get将始终返回默认值0。

无法在理解中使用的表达式中引用正在构造的对象(例如列表或字典)。

答案 2 :(得分:1)

我认为你的理解版本看起来像这样,

count = {}
count = {i: count.get(i,0)+1 for i in a}

执行理解时,count指的是在上一行中创建的空字典。因此count.get(i,0)始终返回0。这就是结果总是1的原因。如果您没有在上一行中定义,那么您将获得

  

NameError:全局名称' count'未定义

因为程序中尚未定义count

注意:您无法在字典理解中引用正在构建的字典。

因此,更新字典在理解中不起作用。你现在实际拥有的解决方案很好。