我想根据 [pid][dbid][eid][sid] 对 [qty] 求和。
此代码适用于 v3.6.4,但当我迁移到 v3.4 时,我收到一条错误消息:
new_d = [ [{'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 10, 'sid': 6}, {'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 20, 'sid': 6}],
[{'pid': 232, 'dbid': 1, 'eid': 6212, 'qty': 1, 'sid': 56}, {'pid': 232, 'dbid': 1, 'eid': 6212, 'qty': 1, 'sid': 56}],
[{'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 100, 'sid': 56}, {'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 100, 'sid': 56}]]
final_result = [{**i[0], **{'qty':sum(b['qty'] for b in i)}} for i in new_d]
^
SyntaxError: invalid syntax
请您参考如下方法:
** 可用于将字典解包为函数调用中的关键字参数。从 python 3.5 开始,PEP 448 -- Additional Unpacking Generalizations被添加到语言中。这扩展了您可以解包元组 (*some_tuple) 和字典 (**some_dict) 的位置。
在
{**i[0], **{'qty':sum(b['qty'] for b in i)}}
i[0] 是列表中的第一个 dict 和 {'qty':sum(b['qty'] for b in i) } 是一个 dict,带有一个键,可以对列表中的 'qty' 值求和。 ** 运算符解包两个字典,并且由于字典构造函数现在支持任意数量的解包,因此两个字典合并为一个。
这一切都可以通过 python 3.4 及更早版本的函数来完成
def d_summary(d_list):
summary = d_list[0].copy()
summary['qty'] = sum(b['qty'] for b in d_list)
return summary
final_result = [d_summary(i) for i in new_d]
