我有以下内容:
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}
我做错了什么?
答案 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
。
注意:您无法在字典理解中引用正在构建的字典。
因此,更新字典在理解中不起作用。你现在实际拥有的解决方案很好。