首页 > 解决方案 > 带解包字典的累加器模式

问题描述

我有一本字典,上面列出了它赢得的国家和金牌。我在那里两次添加了国家智利,看看我是否可以合并一个累加器模式。智利在字典中的值是 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

标签: pythondictionary

解决方案


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

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

另一种可能性是使用字典列表。然后使用Counterfromcollections使您的任务变得微不足道,因为“累加器模式”是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())

推荐阅读