python - 用一个键对具有多个键的字典求和的最有效方法是什么?
问题描述
我有以下 dict 结构。
product1 = {'product_tmpl_id': product_id,
'qty':product_uom_qty,
'price':price_unit,
'subtotal':price_subtotal,
'total':price_total,
}
然后是产品列表,列表中的每一项都是上面结构的dict
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,这并没有变得更好。你可以用 hack 一些东西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
如果您不想将数据保留为数据框,则只需要一点额外的魔力:
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}]
推荐阅读
- c - 无法使用指针获取计数器来计算字符串中的数字、大小写
- python - 为什么我的烧瓶 RESTplus 模型没有注册
- python - 如何在 Windows 中激活我的虚拟环境?
- python - 只用漂亮的汤从谷歌刮取 src 属性
- python - 如何将 Tkinter Sqlite 适配到 Mysql?
- dat.gui - 使用三个 JS 自定义 dat.gui 中的最小值和最大值
- python - 我无法在 Python 64bit 中调用任何 python 命令(尽管设置了安装路径,但 Python 安装在其他地方)
- flutter - 颤振:如何使用同一程序适应所有屏幕尺寸?
- javascript - Uncaught Modal 不是函数 - apex
- r - 无法在 Bookdown 中调整图像大小