【问题标题】:Python3: get sum of values of specific key in list of dictionary [duplicate]Python3:获取字典列表中特定键值的总和[重复]
【发布时间】:2021-01-16 08:08:07
【问题描述】:

我遇到了一个我无法弄清楚的简单问题。
我有一个保存在 json 文件中的对象列表。一旦转换成 Python,它们就会给我这样的东西:

data = [
    {"id": 1, "value": 3},
    {"id": 2, "value": 1},
    {"id": 3, "value": 5},
    {"id": 1, "value": 1},
    {"id": 1, "value": 2},
    {"id": 3, "value": 2},
    {"id": 1, "value": 3}
]

我试图每个唯一的“id”只有一个对象/字典。换句话说,我试图获得以下结果:

[{"id": 1, "value": 9}, {"id": 2, "value": 1}, {"id": 3, "value": 7}]

显然,我可以做到这一点:

foo = list(set([item["id"] for item in data]))

newList = []
for i in foo:
    bar = {"id": i, "value": 0}
    for x in data:
        if x['id'] == i:
            bar['value'] += x['value']

    newList.append(bar)

但是我担心这个三重嵌套循环可能会大大减慢处理大型数据集的过程。

我对@9​​87654325@ 很熟悉,我在collection's Counters 上看到过这个问题,但这些对我来说不起作用。

任何想法如何获得所需的结果?

【问题讨论】:

    标签: json python-3.x list


    【解决方案1】:

    Pandas 来救援!

    首先,根据您的数据创建一个数据框

    df = pd.DataFrame(data)
    print(df)
    
    Output:
       id  value
    0   1      3
    1   2      1
    2   3      5
    3   1      1
    4   1      2
    5   3      2
    6   1      3
    

    然后,group by id 和 sum

    result = df.groupby("id").sum()
    print(result)
    
    Output:
        value
    id       
    1       9
    2       1
    3       7
    

    然后将其转换为您想要的列表:

    new_list = [{"id": elemid, "value": val.value} for elemid, val in result.iterrows()]
    print(new_list)
    # Output: [{'id': 1, 'value': 9}, {'id': 2, 'value': 1}, {'id': 3, 'value': 7}]
    

    或者,您可以改进现有方式:

    data = [
        {"id": 1, "value": 3},
        {"id": 2, "value": 1},
        {"id": 3, "value": 5},
        {"id": 1, "value": 1},
        {"id": 1, "value": 2},
        {"id": 3, "value": 2},
        {"id": 1, "value": 3}
    ]
    
    new_data = {}
    for elem in data:
        elemid = elem["id"]
        value = elem["value"]
        new_data[elemid] = new_data.get(elemid, 0) + value
    
    print(new_data)
    # Output: {1: 9, 2: 1, 3: 7}
    

    然后,将其转换为您想要的列表:

    new_list = [{"id": key, "value": value} for key, value in new_data.items()]
    print(new_list)
    # Output: [{'id': 1, 'value': 9}, {'id': 2, 'value': 1}, {'id': 3, 'value': 7}]
    

    【讨论】:

    • 很遗憾它已关闭以供回答。这是一条线:sums = [{"id": i, "value": sum([d['value'] for d in data if d['id']==1])} for i in set([d['id'] for d in data])]
    • @PeterM。你可能是指d['id'] == i 而不是d['id'] == 1,但无论如何这比我的解决方案更糟糕,因为它是 O(n^2)。它与OP的基本相同
    • 是的,普拉纳夫。 1 应该是 i。
    猜你喜欢
    • 2019-01-16
    • 2021-02-08
    • 2020-04-18
    • 2017-10-23
    • 2020-03-21
    • 2012-01-24
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多