2016-08-15 90 views
0

我有一个从数据库中获取的列表。如何在python中总结字典值?

[{ 
    'name': 'John', 
    'score': 30 
}, { 
    'name': 'Jan', 
    'score': 23 
}, { 
    'name': 'Mike', 
    'score': 34 
}] 

可以numpy得到总分吗? (不通过1循环使用for in 1)

+0

不是重复,我的情况是字典的名单,我只想补充了'score',我也由1像'numpy.sum(名单)' –

+0

喔无环提过1。 。好的,我知道了。收回!我可以建议你更新标题以提及这一点。有点误导。无环部分仅在最后。 – Iceman

+1

标题有误导性。这不是专栏;这是一个字典值。 – hpaulj

回答

3

您可以通过列表解析执行sum做到这一点,收集所有的“分数”:

sum([x['score'] for x in MyListOfDictionaries]) 

(PS numpy的是没有必要的这里)


编辑:由@sebasti指出一个在评论中,围绕列表理解括号内是没有必要的,因为我们是直接插入到一个函数此,即:

sum(x['score'] for x in MyListOfDictionaries) 

这被称为“发电机”的语法;从性能的角度来看,它可以更高效,因为它避免了在处理它之前为列表分配内存的额外步骤。

+2

虽然不需要使用外部的[]括号,您也可以在生成器上调用sum,避免创建包含所有分数的临时列表。 – sebastian

+0

谢谢,很好。我习惯于朱莉娅在那里你不能忽略它们,所以我一直这样做:我会更新你的评论。 :) –

0

NumPy是一个用于数值数组处理的库。您可以使用数字作为列名称,将您的集合转换为矩阵,并使用NumPy进行计算,如果要准确使用NumPy及其性能。

我建议你尝试pandas库:它有一个类型DataFrame这是为了遏制和过程的集合像你(像R语言dataframes或表中MatLab)—表列和行。它有sum方法可以解决你的问题。

我想,这不是你想要用你的数据做的唯一的事情,速度很重要—我建议使用这个库。

这里是相关的StackOverflow的问题,它会告诉你该库的一些能力:

2
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可能能够将这整个列表变成一个数据框,但不要被它的易用性所迷惑 - 它正在做所有这些,以及更多,在封面之下。

1
lst = [{ 
    'name': 'John', 
    'score': 30 
}, { 
    'name': 'Jan', 
    'score': 23 
}, { 
    'name': 'Mike', 
    'score': 34 
}] 

sum(map(lambda x: x['score'], lst))