【问题标题】:Python - sum values in dictionaryPython - 字典中的总和值
【发布时间】:2012-07-26 09:58:54
【问题描述】:

我有一个非常简单的列表:

example_list = [
    {'points': 400, 'gold': 2480},
    {'points': 100, 'gold': 610},
    {'points': 100, 'gold': 620},
    {'points': 100, 'gold': 620}
]

我怎样才能对所有 gold 值求和?我正在寻找漂亮的 oneliner。

现在我正在使用这段代码(但这不是最好的解决方案):

total_gold = 0
for item in example_list:
    total_gold += example_list["gold"]

【问题讨论】:

  • 您不应该使用list 作为局部变量的名称 - 这样做会隐藏内置的list 类型并可能导致问题。
  • 你是对的,我只是在这个例子中使用它。
  • @sigo -- 在这种情况下,存在一个不错的单行,但通常,将答案限制为“不错的单行”可能是一个坏主意(因为可能存在更好的多行)。

标签: python list dictionary


【解决方案1】:
sum(item['gold'] for item in myList)

【讨论】:

    【解决方案2】:

    如果你有记忆力:

    sum(item['gold'] for item in example_list)
    

    如果你非常注重时间:

    sum([item['gold'] for item in example_list])
    

    在大多数情况下,只需使用生成器表达式,因为性能提升仅在非常大的数据集/非常热的代码路径上才会明显。

    请参阅this answer,了解为什么应避免使用地图。

    请参阅this answer,了解列表理解与生成器表达式的一些真实时间比较。

    【讨论】:

    • 为什么类似的sum(item.gold for item in example_list) 不起作用?我收到了AttributeError: 'dict' object has no attribute 'gold'
    • 因为 dict 类型没有名为“gold”的属性(类型成员)。您可能将 Python 与 JavaScript 混淆了。在 JS 中,您可以使用点表示法或索引表示法,因为类似 dict 的对象通常只是一个普通的旧 JS 对象。在 Python 中,dicts 是 dicts,你必须使用索引运算符,所以,long answer long:你想要 item['gold'] 而不是 item.gold
    【解决方案3】:

    如果您更喜欢map,这也可以:

     import operator
     total_gold = sum(map(operator.itemgetter('gold'),example_list))
    

    但我认为 g.d.d.c 发布的生成器要好得多。这个答案真的只是为了指出operator.itemgetter的存在。

    【讨论】:

    • _reduce = lambda fn, ar: fn( ar[0], _reduce(fn, ar[1:])) if len(ar) > 1 else ar[0] total_gold = _reduce((lambda x, y: x + y), (lambda fn, ar: [fn(ar[i]) for i in xrange(len(ar))])( (lambda x: x["gold"]), example_list)) 我也认为 g.d.d.c 的回答很好。这个答案真的只是为了指出 lambda 的存在:P
    • 谢谢 -- 注释格式似乎不尊重换行符,所以它看起来比它应该的更糟糕。
    • @Filipq -- 真的,我发布了与 g.d.d.c 相同的答案,比他晚了大约 30 秒。我最初删除它,但自从我得到愚蠢的版主工具后,我仍然可以看到我删除的答案。它困扰着我,所以我心想,必须有另一种有点干净的方法来说明一些有用的东西......我可能应该只是删除它......我不知道。 (我愿意接受建议)。
    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2014-11-16
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多