[英]Create a new list by summing up existing list 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},
]
我想總結一個具有相似符號的數量並創建一個新列表。 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"}
]
我是 Python 的新手,嘗試了一些方法但沒有用。 我可以嘗試什么來實現這一目標?
如果你可以使用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()
出去:
{'0': {'symbol': 'ABC', 'quantity': 400, 'id': '1 3'},
'1': {'symbol': 'PQR', 'quantity': 1300, 'id': '2 3'},
'2': {'symbol': 'XYZ', 'quantity': 320, 'id': '1'}}
一個很好的解決方案是使用一個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()]
這樣的事情應該適合你:
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)
如果你更喜歡核心 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.