代码之家  ›  专栏  ›  技术社区  ›  DrZoidberg09

如何在字典列表中创建一个新关键字,该关键字是另一个关键字的总和?

  •  1
  • DrZoidberg09  · 技术社区  · 1 年前

    我有一本这样的字典:

    [{'name': 'a', 'age': '20', 'value': '10'}, {'name': 'a', 'age': '30', 'value': '15'}, {'name': 'a', 'age': '40', 'value': '25'}, {'name': 'b', 'age': '20', 'value': '11'}, {'name': 'b', 'age': '30', 'value': '12'}, {'name': 'b', 'age': '40', 'value': '13'}...]

    现在我想添加一个新的键,它包含相同名称的所有值的总和,如下所示:

    [{'name': 'a', 'age': '20', 'value': '10', 'sum': '50'}, {'name': 'a', 'age': '30', 'value': '15', 'sum': '50'}, {'name': 'a', 'age': '40', 'value': '25', 'sum': '50'}, {'name': 'b', 'age': '20', 'value': '11', 'sum': '36'}, {'name': 'b', 'age': '30', 'value': '12', 'sum': '36'}, {'name': 'b', 'age': '40', 'value': '13', 'sum': '36'}...]

    我已经在使用Pandas进行分组和聚合了。Pandas也可以这样做吗?或者有标准的Python变体吗?

    5 回复  |  直到 1 年前
        1
  •  0
  •   DMYTRO KOSHELIEV    1 年前

    是的,你可以用熊猫来实现这一点。下面是一个示例代码:

    import pandas as pd
    
    # create the dictionary
    data = [{'name': 'a', 'age': '20', 'value': '10'},
            {'name': 'a', 'age': '30', 'value': '15'},
            {'name': 'a', 'age': '40', 'value': '25'},
            {'name': 'b', 'age': '20', 'value': '11'},
            {'name': 'b', 'age': '30', 'value': '12'},
            {'name': 'b', 'age': '40', 'value': '13'}]
    
    # create a DataFrame from the dictionary
    df = pd.DataFrame(data)
    
    # convert the 'value' column to numeric values
    df['value'] = pd.to_numeric(df['value'])
    
    # create a new column 'sum' with the sum of 'value' for each 'name'
    df['sum'] = df.groupby('name')['value'].transform('sum')
    
    # convert the 'sum' column to string values
    df['sum'] = df['sum'].astype(str)
    
    # convert the DataFrame back to a list of dictionaries
    result = df.to_dict(orient='records')
    
    print(result)
    

    此代码从字典中创建一个Pandas DataFrame,将“value”列转换为数值,按“name”对DataFrame进行分组,计算每个组的“value”总和,并创建一个新列“sum”,其中每个“name”的总和为“value”。最后,它将“sum”列转换为字符串值,并将DataFrame转换回字典列表。

    输出应该是一个字典列表,其中为每个“name”添加了“sum”列。

        2
  •  0
  •   Andrej Kesely    1 年前

    另一种解决方案,没有 ,使用纯Python:

    lst = [
        {"name": "a", "age": "20", "value": "10"},
        {"name": "a", "age": "30", "value": "15"},
        {"name": "a", "age": "40", "value": "25"},
        {"name": "b", "age": "20", "value": "11"},
        {"name": "b", "age": "30", "value": "12"},
        {"name": "b", "age": "40", "value": "13"},
    ]
    
    out = {}
    for d in lst:
        out.setdefault(d["name"], []).append(d)
    
    tmp = {k: sum(int(i["value"]) for i in v) for k, v in out.items()}
    
    out = [{**v, "sum": str(tmp[v["name"]])} for v in lst]
    print(out)
    

    打印:

    [
        {"name": "a", "age": "20", "value": "10", "sum": "50"},
        {"name": "a", "age": "30", "value": "15", "sum": "50"},
        {"name": "a", "age": "40", "value": "25", "sum": "50"},
        {"name": "b", "age": "20", "value": "11", "sum": "36"},
        {"name": "b", "age": "30", "value": "12", "sum": "36"},
        {"name": "b", "age": "40", "value": "13", "sum": "36"},
    ]
    
        3
  •  0
  •   AVINNA ABHIJEET MOHANTY    1 年前

    要在字典列表中创建一个新的关键字,该关键字是另一个关键字的总和,可以遍历列表中的每个字典并计算所需关键字的总和。然后,将计算出的和添加到每个字典中。下面是一个Python示例,假设您要添加一个名为“sum_key”的新键,该键包含“key1”和“key2”的总和:

    # Example list of dictionaries
    list_of_dicts = [
        {'key1': 10, 'key2': 20},
        {'key1': 5, 'key2': 15},
        {'key1': 8, 'key2': 12}
    ]
    
    # Iterate through the list and calculate the sum of 'key1' and 'key2'
    for dictionary in list_of_dicts:
        dictionary['sum_key'] = dictionary['key1'] + dictionary['key2']
    
    # Resulting list of dictionaries with the new 'sum_key' added
    print(list_of_dicts)
    

    输出将是:

    [
        {'key1': 10, 'key2': 20, 'sum_key': 30},
        {'key1': 5, 'key2': 15, 'sum_key': 20},
        {'key1': 8, 'key2': 12, 'sum_key': 20}
    ]
    

    现在,列表中的每个字典都有一个新键“sum_key”,其中包含“key1”和“key2”的总和。

        4
  •  0
  •   SIGHUP    1 年前

    另一个没有panda但带有defaultdict的选项:

    from collections import defaultdict
    
    data = [{'name': 'a', 'age': '20', 'value': '10'},
            {'name': 'a', 'age': '30', 'value': '15'},
            {'name': 'a', 'age': '40', 'value': '25'},
            {'name': 'b', 'age': '20', 'value': '11'},
            {'name': 'b', 'age': '30', 'value': '12'},
            {'name': 'b', 'age': '40', 'value': '13'}]
    
    temp = defaultdict(int)
    
    for d in data:
        temp[d['name']] += int(d['value'])
    
    for d in data:
        d['sum'] = str(temp[d['name']])
    
    print(data)
    

    …或者没有defaultdict。。。

    temp = {}
    
    for d in data:
        name = d['name']
        temp[name] = temp.get(name, 0) + int(d['value'])
    
    for d in data:
        d['sum'] = str(temp[d['name']])
    
        5
  •  0
  •   Darragh    1 年前

    下面的代码使用一个新的“sum”键更新列表中的每个字典,该键是具有相同“name”键的每个字典的值的总和。

    your_list = [
        {'name': 'a', 'age': '20', 'value': '10'}, 
        {'name': 'a', 'age': '30', 'value': '15'},
        {'name': 'a', 'age': '40', 'value': '25'},  
        {'name': 'b', 'age': '20', 'value': '11'}, 
        {'name': 'b', 'age': '30', 'value': '12'},
        {'name': 'b', 'age': '40', 'value': '13'},
        ...
    ]
    
    previous = {}
    for obj in your_list:
        name = obj["name"]
        
        # Check if we already calculated the sum
        value_sum = previous.get(name)
        if value_sum is None:
            value_sum = sum(int(d["value"]) for d in your_list if d["name"] == name)
            previous[name] = value_sum
        
        obj["sum"] = str(value_str)  # If you want it as type 'str'
    
    print(your_list)
    

    输出:

    >>>
    {'name': 'a', 'age': '20', 'value': '10', 'sum': '50'}
    {'name': 'a', 'age': '30', 'value': '15', 'sum': '50'}
    {'name': 'a', 'age': '40', 'value': '25', 'sum': '50'}
    {'name': 'b', 'age': '20', 'value': '11', 'sum': '36'}
    {'name': 'b', 'age': '30', 'value': '12', 'sum': '36'}
    {'name': 'b', 'age': '40', 'value': '13', 'sum': '36'}
    ...