【问题标题】:How to sum dictionary value in python?如何在python中对字典值求和?
【发布时间】:2016-12-21 07:37:28
【问题描述】:

我有一个从数据库中获取的列表。

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

numpy可以得到分数的总和吗? (不使用 for in 逐一循环)

【问题讨论】:

  • 不重复,我的情况是字典列表,我只想添加score,并且我确实提到了没有通过1逐1循环。就像numpy.sum(list)
  • 哦..好的。撤回!!我可以建议您更新标题以提及这一点。有点误导。无循环部分仅在末尾。
  • 标题具有误导性。这不是专栏;这是一个字典值。

标签: python numpy dictionary


【解决方案1】:

您可以通过在收集所有“分数”的列表推导上执行sum 来做到这一点:

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

(PS. 这里不需要 Numpy)


编辑: 正如 @sebastian 在 cmets 中指出的那样,列表理解周围的括号不是必需的,因为我们将其直接插入一个函数,即:

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

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

【讨论】:

  • 虽然不需要外部 [] 括号 - 您也可以在生成器上调用 sum,避免创建包含所有分数的临时列表。
  • 谢谢,很好。我已经习惯了 julia,你不能忽略它们,所以我继续这样做:p 我会用你的评论更新。 :)
【解决方案2】:

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

我建议您尝试 pandas 库:它有一个 DataFrame 类型,它被创建用于包含和处理像您这样的集合(如 R 语言中的数据框或 MatLab 中的表) - 具有列和行。它有sum 方法可以解决你的问题。

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

这里有相关的 StackOverflow 问题,它们将向您展示该库的一些能力:

【讨论】:

    【解决方案3】:
    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 或许能够将整个列表转换为数据框,但不要被它的易用性所迷惑——它在幕后完成了所有这些工作,甚至更多。

    【讨论】:

      【解决方案4】:
      lst = [{
        'name': 'John',
        'score': 30
      }, {
        'name': 'Jan',
        'score': 23
      }, {
        'name': 'Mike',
        'score': 34
      }]
      
      sum(map(lambda x: x['score'], lst))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-19
        • 2015-07-31
        • 2023-02-01
        • 2023-03-24
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        相关资源
        最近更新 更多