繁体   English   中英

python 计数器的行为是否预期如下?

[英]Is python Counter expected to behave as follows?

我有一个字典列表如下

[
    {'sex': 2, 'newspaper_sheet__country': 'ML', 'n': 7},
    {'sex': 1, 'newspaper_sheet__country': 'ML', 'n': 5},
    {'sex': 2, 'newspaper_sheet__country': 'ML', 'n': 10}
]

然后我有 2 个计数器

from collections import Counter

counts = Counter()
counts1 = Counter()

我正在更新以下格式的两个计数器

for row in rows:
    counts.update({(row['sex'], row['newspaper_sheet__country']): row['n']})

counts1.update({(row['sex'], row['newspaper_sheet__country']): row['n'] for row in rows})

我希望 2 个计数的值是相同的,因为唯一的区别是 1 使用 for 循环,另一个使用 dict 理解。

为什么这2个值不同?

通过在for循环的每次迭代中调用Counter.updateCounter object 将使用每次调用的输入字典进行更新。

使用 dict 理解,键值在传递给Counter.update之前首先聚合到 dict 中。 由于 dict 理解中复制键的后面值将覆盖相同键的前面值,因此键的值10 (2, 'ML')会覆盖同一键的值7 ,导致Counter object 不考虑最后的值为7

因为在这样的循环中调用.update并不等同于传递字典推导的结果,所以看看字典推导创建了什么:

>>> rows = [
...     {'sex': 2, 'newspaper_sheet__country': 'ML', 'n': 7},
...     {'sex': 1, 'newspaper_sheet__country': 'ML', 'n': 5},
...     {'sex': 2, 'newspaper_sheet__country': 'ML', 'n': 10}
... ]
>>> {(row['sex'], row['newspaper_sheet__country']): row['n'] for row in rows}
{(2, 'ML'): 10, (1, 'ML'): 5}

字典有唯一的键,最后看到的项目被保留。

不同之处在于update()是通过列表理解完成的。

使用基于循环的方法,计数器每次都会更新并聚合匹配键的计数,但使用列表理解方法,它只会获得具有唯一键的字典。

列表理解方法可以分解为:

dic = {(row['sex'], row['newspaper_sheet__country']): row['n'] for row in rows}
print(dic)  # dic only contains unique key value pairs here
counts1.update(dic)

因此,由于基于循环的方法, counts1仅更新一次,而counts会多次更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM