当前位置: 首页 > 面试题库 >

用Python分组并汇总字典列表的值

柳浩大
2023-03-14
问题内容

我试图以一种优雅的方式编写一个函数,该函数将字典列表进行分组并汇总(加和)like键的值。

例:

my_dataset = [  
    {
        'date': datetime.date(2013, 1, 1),
        'id': 99,
        'value1': 10,
        'value2': 10
    },
    {
        'date': datetime.date(2013, 1, 1),
        'id': 98,
        'value1': 10,
        'value2': 10
    },
    {
        'date': datetime.date(2013, 1, 2),
        'id' 99,
        'value1': 10,
        'value2': 10
    }
]

group_and_sum_dataset(my_dataset, 'date', ['value1', 'value2'])

"""
Should return:
[
    {
        'date': datetime.date(2013, 1, 1),
        'value1': 20,
        'value2': 20
    },
    {
        'date': datetime.date(2013, 1, 2),
        'value1': 10,
        'value2': 10
    }
]
"""

我尝试使用itertools为groupby进行此操作,并对每个相似键值对进行求和,但是这里缺少一些内容。这是我的函数当前的样子:

def group_and_sum_dataset(dataset, group_by_key, sum_value_keys):
    keyfunc = operator.itemgetter(group_by_key)
    dataset.sort(key=keyfunc)
    new_dataset = []
    for key, index in itertools.groupby(dataset, keyfunc):
        d = {group_by_key: key}
        d.update({k:sum([item[k] for item in index]) for k in sum_value_keys})
        new_dataset.append(d)
    return new_dataset

问题答案:

您可以使用collections.Countercollections.defaultdict

使用dict可以在中完成O(N),而排序则需要O(NlogN)时间。

from collections import defaultdict, Counter
def solve(dataset, group_by_key, sum_value_keys):
    dic = defaultdict(Counter)
    for item in dataset:
        key = item[group_by_key]
        vals = {k:item[k] for k in sum_value_keys}
        dic[key].update(vals)
    return dic
... 
>>> d = solve(my_dataset, 'date', ['value1', 'value2'])
>>> d
defaultdict(<class 'collections.Counter'>,
{
 datetime.date(2013, 1, 2): Counter({'value2': 10, 'value1': 10}),
 datetime.date(2013, 1, 1): Counter({'value2': 20, 'value1': 20})
})

的优点Counter是它将自动将相似键的值相加。

例:

>>> c = Counter(**{'value1': 10, 'value2': 5})
>>> c.update({'value1': 7, 'value2': 3})
>>> c
Counter({'value1': 17, 'value2': 8})


 类似资料:
  • 问题内容: 请问用多个键分组并汇总/平均使用Python词典列表的值的最pythonic方法是什么?假设我有以下词典列表: 所需的汇总输出: 或平均: 我发现了这一点:用Python组合并汇总字典列表的值,但这似乎没有给我我想要的东西。 问题答案: 获取汇总结果 输出量 为了获得平均值,您可以像这样简单地更改for循环内的内容 输出量 建议: 无论如何,我会像这样同时添加和和 输出量

  • 问题内容: 我有以下词典列表: 我想对每个求和并在字典列表中得到以下结果: 问题答案: from collections import defaultdict 它产生: 要将其转换为词典列表: 结果:

  • 问题内容: 我有这种形式的字典清单: 我想像这样通过列表中的每个元素通过键求和: 我尝试过的是以下内容: 但它仍然不起作用。 问题答案: 您想要的是集合类型。集合上的Python文档最能描述它,但是从本质上讲a是一种特殊的字典,其中所有值都是整数。您可以传递任何密钥(包括不存在的密钥)并将其添加。例如: 编辑:@timgeb提供了此答案的一种变体,该变体在对象上本地使用了该方法。我建议将其作为此处

  • 问题内容: 我正在尝试合并三个具有相同键,值列表或单个值的字典。 我需要将值中的所有项目添加到一个列表中。 我尝试了几种方法,但是大多数方法将值放入嵌套列表中。例如 我尝试通过遍历值来更新它: 但结果完全一样。我试图简单地添加列表,但是由于第三个字典只有一个浮点数,所以我做不到。 因此,我尝试首先以1和2的值添加列表,然后附加3的值。添加列表效果很好,但是当我尝试从第三个字典中添加浮点数时,突然整

  • 下图是三组相互接触的方块,每个方块都有编号。 我已经能够使用空间库ArcPy构建下面的字典,它使用平方数作为键,并使用它所触及的平方的数字列表作为值。例如,正方形1只接触正方形4,正方形4接触正方形1和6,依此类推。 从图中可以清楚地看到,有三组相互接触的正方形,所以我想要的结果是一个新的字典,其中的键是正方形的数字,值是它所属的接触组。我将使用字母命名接触组,但这些名称可以是任何名称,因此一个可

  • 本文向大家介绍python 字典套字典或列表的示例,包括了python 字典套字典或列表的示例的使用技巧和注意事项,需要的朋友参考一下 文件f1 A 1 a A 1 b A 2 C B 2 a B 2 b 生成如下字典: 以上这篇python 字典套字典或列表的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。