我有一个从数据库中获取的列表。如何在python中总结字典值?
[{
'name': 'John',
'score': 30
}, {
'name': 'Jan',
'score': 23
}, {
'name': 'Mike',
'score': 34
}]
可以numpy得到总分吗? (不通过1循环使用for in
1)
我有一个从数据库中获取的列表。如何在python中总结字典值?
[{
'name': 'John',
'score': 30
}, {
'name': 'Jan',
'score': 23
}, {
'name': 'Mike',
'score': 34
}]
可以numpy得到总分吗? (不通过1循环使用for in
1)
您可以通过列表解析执行sum
做到这一点,收集所有的“分数”:
sum([x['score'] for x in MyListOfDictionaries])
(PS numpy的是没有必要的这里)
编辑:由@sebasti指出一个在评论中,围绕列表理解括号内是没有必要的,因为我们是直接插入到一个函数此,即:
sum(x['score'] for x in MyListOfDictionaries)
这被称为“发电机”的语法;从性能的角度来看,它可以更高效,因为它避免了在处理它之前为列表分配内存的额外步骤。
虽然不需要使用外部的[]括号,您也可以在生成器上调用sum,避免创建包含所有分数的临时列表。 – sebastian
谢谢,很好。我习惯于朱莉娅在那里你不能忽略它们,所以我一直这样做:我会更新你的评论。 :) –
In [1963]: ll=[{
...: 'name': 'John',
...: 'score': 30
...: }, {
...
...: }]
首先显而易见的迭代求解
In [1965]: sum([d['score'] for d in ll])
Out[1965]: 87
我可以把它变成一个对象数组:
In [1966]: np.array(ll)
Out[1966]:
array([{'score': 30, 'name': 'John'}, {'score': 23, 'name': 'Jan'},
{'score': 34, 'name': 'Mike'}], dtype=object)
而是直接将sum
到也无济于事。但是:
In [1967]: from operator import itemgetter
In [1970]: np.frompyfunc(itemgetter('score'),1,1)(ll).sum()
Out[1970]: 87
见我最近回答 https://stackoverflow.com/a/38936480/901925更多关于如何访问数组对象的属性。
frompyfunc
并没有真正摆脱迭代 - 它只是以一种用户友好的方式包装它。对于列表中的每个字典,itemgetter
仍然在执行item['score']
。
此使用的itemgetter
是基本相同:
In [1974]: list(map(itemgetter('score'), ll))
Out[1974]: [30, 23, 34]
列表理解,地图,frompyfunc
是通过列表迭代,并正从每个字典的score
值的所有方式。
pandas
可能能够将这整个列表变成一个数据框,但不要被它的易用性所迷惑 - 它正在做所有这些,以及更多,在封面之下。
lst = [{
'name': 'John',
'score': 30
}, {
'name': 'Jan',
'score': 23
}, {
'name': 'Mike',
'score': 34
}]
sum(map(lambda x: x['score'], lst))
不是重复,我的情况是字典的名单,我只想补充了'score',我也由1像'numpy.sum(名单)' –
喔无环提过1。 。好的,我知道了。收回!我可以建议你更新标题以提及这一点。有点误导。无环部分仅在最后。 – Iceman
标题有误导性。这不是专栏;这是一个字典值。 – hpaulj