简体   繁体   English

通过汇总 Python 中的现有列表来创建新列表

[英]Create a new list by summing up existing list in Python

I have a list like this in Python:我在 Python 中有一个这样的列表:

my_list = [
            {"id":1,"symbol":"ABC","quantity":100},
            {"id":2,"symbol":"PQR","quantity":500},
            {"id":3,"symbol":"ABC","quantity":300},
            {"id":1,"symbol":"XYZ","quantity":320},
            {"id":3,"symbol":"PQR","quantity":800},
         ]

I wanted to sum up a quantity which have similar symbols and create a new list.我想总结一个具有相似符号的数量并创建一个新列表。 The new_list will look like this: new_list 将如下所示:

new_list = [
             { "symbol":"ABC","total_quantity":400,"ids":"1 3"}
             { "symbol":"PQR","total_quantity":1300,"ids":"2 3"}
             { "symbol":"XYZ","total_quantity":320,"ids":"1"}
           ]

I am fairly new to Python and tried some ways but not working.我是 Python 的新手,尝试了一些方法但没有用。 What can I try to achieve this?我可以尝试什么来实现这一目标?

if you are fine to use pandas , you can take this approach如果你可以使用pandas ,你可以采用这种方法

import pandas as pd
df = pd.DataFrame.from_dict(my_list)
df1 = df.groupby('symbol').agg({'quantity':'sum',
                          'id':lambda x: ' '.join(map(str, x))}).reset_index()

Out:出去:

{'0': {'symbol': 'ABC', 'quantity': 400, 'id': '1 3'},
 '1': {'symbol': 'PQR', 'quantity': 1300, 'id': '2 3'},
 '2': {'symbol': 'XYZ', 'quantity': 320, 'id': '1'}}

A nice solution, is to use a defaultdict that facilitates the grouping per symbol , you just need a final step to build the ids一个很好的解决方案是使用一个defaultdict来促进每个symbol的分组,你只需要最后一步来构建ids

from collections import defaultdict

my_list = [{"id": 1, "symbol": "ABC", "quantity": 100},
           {"id": 2, "symbol": "PQR", "quantity": 500},
           {"id": 3, "symbol": "ABC", "quantity": 300},
           {"id": 1, "symbol": "XYZ", "quantity": 320},
           {"id": 3, "symbol": "PQR", "quantity": 800}, ]

expected = defaultdict(lambda: {'symbol': '', 'ids': [], "total_quantity": 0})
for row in my_list:
    expected[row['symbol']]['symbol'] = row['symbol']
    expected[row['symbol']]['ids'].append(str(row['id']))
    expected[row['symbol']]['total_quantity'] += row['quantity']

result = [{**x, 'ids': " ".join(x['ids'])} for x in expected.values()]

Something like this should work for you:这样的事情应该适合你:

my_list = [
            {"id":1,"symbol":"ABC","quantity":100},
            {"id":2,"symbol":"PQR","quantity":500},
            {"id":3,"symbol":"ABC","quantity":300},
            {"id":1,"symbol":"XYZ","quantity":320},
            {"id":3,"symbol":"PQR","quantity":800},
         ]
new_list = []
for item in my_list:
    if item["symbol"] not in [new_item["symbol"] for new_item in new_list]:
        new_list.append({"symbol":item["symbol"],"total_quantity":item["quantity"],"ids":str(item["id"])})
    else:
        for new_item in new_list:
            if item["symbol"] == new_item["symbol"]:
                new_item["total_quantity"] += item["quantity"]
                new_item["ids"] += " "+str(item["id"])
                break
print(new_list)

If you prefer a core Python solution, you can do:如果你更喜欢核心 Python 解决方案,你可以这样做:

my_list = [
            {"id":1,"symbol":"ABC","quantity":100},
            {"id":2,"symbol":"PQR","quantity":500},
            {"id":3,"symbol":"ABC","quantity":300},
            {"id":1,"symbol":"XYZ","quantity":320},
            {"id":3,"symbol":"PQR","quantity":800},
         ]

res = []
for sym in sorted(set([x['symbol'] for x in my_list])):
    tmp = {}
    tmp['symbol'] = sym
    tmp['ids'] = r' '.join([str(x['id']) for x in my_list if x['symbol'] == sym])
    tmp['total_quantity'] = sum([x['quantity'] for x in my_list if x['symbol'] == sym])
    res.append(tmp)
       
print(res)
#[{'symbol': 'ABC', 'total_quantity': 400, 'ids': '1 3'}, 
# {'symbol': 'PQR', 'total_quantity': 1300, 'ids': '2 3'}, 
# {'symbol': 'XYZ', 'total_quantity': 320, 'ids': '1'}]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM