带解包字典的累加器模式

时间:2019-07-09 03:52:06

标签: python dictionary

我有一本词典,其中列出了国家/地区列表和它所获得的金牌。我在该国家添加了两次智利,以查看是否可以合并累加器模式。智利词典中的值分别为13和122。

由于某种原因,当我运行我的代码时,chile_golds的输出是122,而不是135。有人可以告诉我我的代码哪里出错了吗?我想总结一下当For Loop在字典中遇到“智利”时的奖牌数量。

非常感谢您。

total_golds = {"Italy": 114, "Germany": 782, "Pakistan": 10, "Sweden": 627, "USA": 2681, "Zimbabwe": 8, "Greece": 111, "Mongolia": 24, "Brazil": 108, "Croatia": 34, "Algeria": 15, "Switzerland": 323, "Yugoslavia": 87, "China": 526, "Egypt": 26, "Norway": 477, "Spain": 133, "Australia": 480, "Slovakia": 29, "Canada": 22, "New Zealand": 100, "Denmark": 180, "Chile": 13, "Argentina": 70, "Thailand": 24, "Cuba": 209, "Uganda": 7,  "England": 806, "Denmark": 180, "Chile": 122, "Bahamas": 12}

chile_golds = 0

for k,v in total_golds.items():
  if k == "Chile":
    chile_golds = chile_golds + v

print(chile_golds)

实际输出:122 预期输出:135

2 个答案:

答案 0 :(得分:2)

在Python中,字典不应该具有多个键(在示例中为“智利”)。在这种情况下,total_golds变量中仅存储一个条目。应该改用其他数据结构。通常可以使用元组列表:

total_golds = [("Italy", 114), ... ] 

另一种可能性是使用字典列表。然后使用Counter中的collections使您的任务变得微不足道,因为“累加器模式”是sum函数的一部分:

>>> from collections import Counter
>>> total_golds = [{"Italy": 114}, {"Chile": 122}, {"Chile": 13}]
>>> counted = sum([Counter(chunk) for chunk in total_golds], Counter())
>>> print(counted["Chile"])
135

通常由哪种操作决定使用哪种数据结构。字典允许通过键快速检索值。当一个人需要一个接一个地迭代序列时,项目列表可能会更好。

在上面,列表理解可以用生成器表达式代替:

counted = sum((Counter(chunk) for chunk in total_golds), Counter())

答案 1 :(得分:1)

如果您想保留dict结构,请使用collections.Counter

from collections import Counter

d = Counter({'Chile': 3})
d.update(Chile=10)
print(d)

输出

Counter({'Chile': 13})

与原始dict不同,Counter.update添加计数而不是替换计数。