Python - 字典中的和值

Mat*_*łło 52 python dictionary list

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

example_list = [
    {'points': 400, 'gold': 2480},
    {'points': 100, 'gold': 610},
    {'points': 100, 'gold': 620},
    {'points': 100, 'gold': 620}
]
Run Code Online (Sandbox Code Playgroud)

我如何总结所有黄金价值?我正在寻找漂亮的oneliner.

现在我正在使用此代码(但它不是最佳解决方案):

total_gold = 0
for item in example_list:
    total_gold += example_list["gold"]
Run Code Online (Sandbox Code Playgroud)

g.d*_*d.c 128

sum(item['gold'] for item in myLIst)
Run Code Online (Sandbox Code Playgroud)


Ben*_*rns 11

如果你有记忆意识:

sum(item['gold'] for item in example_list)
Run Code Online (Sandbox Code Playgroud)

如果你非常注意时间:

sum([item['gold'] for item in example_list])
Run Code Online (Sandbox Code Playgroud)

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

请参阅此答案,了解为何应避免使用地图.

请参阅此答案,了解列表理解与生成器表达式的实际时序比较.

  • 因为 dict 类型没有名为“gold”的属性(类型成员)。您可能将 Python 与 JavaScript 混淆了。在 JS 中,您可以使用点表示法或索引表示法,因为类似 dict 的对象通常只是一个普通的旧 JS 对象。在Python中,字典就是字典,你必须使用索引运算符,所以,长答案:你想要“item['gold']”而不是“item.gold”。 (2认同)

mgi*_*son 8

如果您愿意map,这也适用:

 import operator
 total_gold = sum(map(operator.itemgetter('gold'),example_list))
Run Code Online (Sandbox Code Playgroud)

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

  • `_reduce = lambda fn, ar: fn( ar[0], _reduce(fn, ar[1:])) 如果 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))` 我也认为 gddc 的回答很好。这个答案实际上只是为了指出 lambda 的存在:P (5认同)

xmd*_*han 5

from collections import Counter
from functools import reduce
from operator import add

sum_dict = reduce(add, (map(Counter, example_list)))
# Counter({'points': 700, 'gold': 4330})
total_gold = sum_dict['gold']
Run Code Online (Sandbox Code Playgroud)