我有两本字典:
# shop_qs
[{'month': 'Jul', 'sales': 1, 'revenue': Decimal('180')}, {'month': 'Aug', 'sales': 2, 'revenue': Decimal('525')}]
# com_qs
[{'month': 'Jun', 'sales': 1, 'revenue': Decimal('200')}, {'month': 'Aug', 'sales': 1, 'revenue': Decimal('450')}]
我尝试按月份合并两个列表中的字典,然后将该月份的sales字段中的值和revenue字段中的值相加。
这就是我所试图追求的,但是,正如你所看到的,产生的结果远没有接近所期望的。
total_chained_ls = list(chain(shop_qs, com_qs))
total_ls = defaultdict(int)
for d in total_chained_ls:
for k, v in d.items():
if isinstance(v, int) or isinstance(v, decimal.Decimal):
total_ls[k] = total_ls[k] + v
else:
total_ls[k] = v
# defaultdict(<class 'int'>, {'month': 'Aug', 'sales': 5, 'revenue': Decimal('1355')})
这是所需的输出:
[{'month': 'Jun', 'sales': 1, 'revenue': Decimal('200')}, {'month': 'Jul', 'sales': 1, 'revenue': Decimal('180')}, {'month': 'Aug', 'sales': 3, 'revenue': Decimal('975')}]
在Python中,您将如何着手进行此操作?
- 注意:字段中的
Decimal
值的作用类似于普通整数。*
2条答案
按热度按时间9rnv2umw1#
看看这是否能帮助您:
hc2pp10m2#
您正确地应用了
chain()
来合并列表,但是您不应该将返回的迭代器消耗到列表中,因为它会将整个表达式转换为shop_qs + com_qs
。由于您有静态键需要求和,因此您不需要初始化内部循环来迭代每个字典中的对,而只需要手动求和。通过某些编辑,您的代码可以转换为:dict.pop()
将同时修改shop_qs
和com_qs
的项目。*执行后,您的
total_ls
将具有以下格式的数据:你可以使用next list comprehension把它转换回字典列表:
另一种按特定条件合并项的方法是对排序后的数据使用
groupby()
。