我有以下字典结构。
product1 = {'product_tmpl_id': product_id,
'qty':product_uom_qty,
'price':price_unit,
'subtotal':price_subtotal,
'total':price_total,
}
然后是产品列表,列表中的每个项目都是具有上述结构的字典
list_ = [product1,product2,product3,.....]
我需要对列表中的项求和,并按键
product_tmpl_id
进行分组……我使用的是dictcollections,但它仅求和了qty键,我需要对除product_tmpl_id
以外的键进行求和,这是进行分组的标准c = defaultdict(float)
for d in list_:
c[d['product_tmpl_id']] += d['qty']
c = [{'product_id': id, 'qty': qty} for id, qty in c.items()]
我知道如何通过for迭代来做到这一点,但是试图寻找一种更pythonic的方式
谢谢
编辑:
需要通过的是:
lst = [
{'Name': 'A', 'qty':100,'price':10},
{'Name': 'A', 'qty':100,'price':10},
{'Name': 'A', 'qty':100,'price':10},
{'Name': 'B', 'qty':100,'price':10},
{'Name': 'C', 'qty':100,'price':10},
{'Name': 'C', 'qty':100,'price':10},
]
对此
group_lst = [
{'Name': 'A', 'qty':300,'price':30},
{'Name': 'B', 'qty':100,'price':10},
{'Name': 'C', 'qty':200,'price':20},
]
最佳答案
使用基本的Python,这并没有得到很多更好的结果。您可以与itertools.groupby
一起破解某些东西,但是它很丑陋,而且速度可能较慢,当然还不清楚。
但是,正如@ 9769953所建议的那样,Pandas是处理此类结构化表格数据的好软件包。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame(lst)
Out[2]:
Name price qty
0 A 10 100
1 A 10 100
2 A 10 100
3 B 10 100
4 C 10 100
5 C 10 100
In [3]: df.groupby('Name').agg(sum)
Out[3]:
price qty
Name
A 30 300
B 10 100
C 20 200
如果您不想将数据保留为数据帧,则只需要一点额外的mojo:
In [4]: grouped = df.groupby('Name', as_index=False).agg(sum)
In [5]: list(grouped.T.to_dict().values())
Out[5]:
[{'Name': 'A', 'price': 30, 'qty': 300},
{'Name': 'B', 'price': 10, 'qty': 100},
{'Name': 'C', 'price': 20, 'qty': 200}]
关于python - 用一个键将多个键的字典相加的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50974070/