Python3.4字典解包语法报错:按多字段分组求和问题
解决Python 3.4中字典合并语法报错的问题
嗨,我来帮你搞定这个问题~
你遇到的语法错误,根源在于你用的{**i[0], **{'qty': sum(...)}}这种字典合并写法是Python 3.5及以上版本才支持的(PEP 448引入的扩展解包语法),而Python 3.4并不兼容这个语法,所以才会抛出SyntaxError。
下面给你两种Python 3.4完全兼容的解决方案,都能实现你要的按[pid][dbid][eid][sid]分组求和qty的需求:
方法一:用字典的copy()+update()(直观易懂)
这种写法逻辑清晰,适合需要高可读性的场景:
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 = [] for group in new_d: # 复制分组里第一个字典的所有键值对 result_item = group[0].copy() # 计算当前分组的qty总和并覆盖原qty result_item['qty'] = sum(item['qty'] for item in group) final_result.append(result_item)
方法二:用dict()构造函数(保持列表推导式风格)
如果你偏好原来的列表推导式写法,可以用Python 3.4支持的dict(原字典, **新键值对)语法:
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 = [dict(group[0], **{'qty': sum(item['qty'] for item in group)}) for group in new_d]
两种方法运行后都会得到你想要的结果:
[ {'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 30, 'sid': 6}, {'pid': 232, 'dbid': 1, 'eid': 6212, 'qty': 2, 'sid': 56}, {'pid': 146, 'dbid': 1, 'eid': 6212, 'qty': 200, 'sid': 56} ]
内容的提问来源于stack exchange,提问作者Jason TK
相关产品推荐
相关产品推荐

