合并两个列表词典的最pythonic方法是什么?假设我有两个词典列表:
sold=[
{'dept': '001', 'sku': 'foo', 'qty': 100},
{'dept': '002', 'sku': 'bar', 'qty': 200},
{'dept': '003', 'sku': 'baz', 'qty': 300}
]
returns=[
{'dept': '001', 'sku': 'foo', 'qty': 10},
{'dept': '002', 'sku': 'bar', 'qty': 20}
]
desired_output=[
{'dept': '001', 'sku': 'foo', 'sold': 100, 'return': 10},
{'dept': '002', 'sku': 'bar', 'sold': 200, 'return': 20},
{'dept': '003', 'sku': 'baz', 'sold': 300, 'return': 0}
]
下面的代码有效,但有更优雅/ pythonic的方式来做到这一点
merge = []
for s in sold:
found = False
for r in returns:
if (s.get('sku') == r.get('sku') and s.get('dept') == r.get('dept')):
merge.append({'sku': r.get('sku'), 'dept': r.get('dept'), 'sold': s.get('qty'), 'return': r.get('qty')})
found = True
break
if not found:
merge.append({'sku': s.get('sku'), 'dept': s.get('dept'), 'sold': s.get('qty'), 'return': 0})
我已查看过这篇文章:How to merge lists of dictionaries,它并没有完全符合我的要求:
我尝试了类似下面的内容但却无法正常工作:
result = [
s['return'] = r['qty']
for s in sold
for r in return
if s['sku'] == r['sku'] and s['dept'] == r['dept']]
由于
答案 0 :(得分:1)
这会改变sold
字典。
temp = {(cd["dept"], cd["sku"]):cd["qty"] for cd in returned}
for cd in sold:
cd["sold"] = cd["qty"]
del cd["qty"]
cd["return"] = temp.get((cd["dept"], cd["sku"]), 0)
print sold
如果您不想改变它,可以使用此
temp, result = {(cd["dept"], cd["sku"]):cd["qty"] for cd in returned}, []
for cd in sold:
temp_dict = {}
for k, v in cd.items():
if k == "sold":
temp_dict["sold"] = cd["qty"]
else:
temp_dict[k] = cd[k]
temp_dict["return"] = temp.get((cd["dept"], cd["sku"]), 0)
result.append(temp_dict)
print result
<强>输出强>
[{'sku': 'foo', 'dept': '001', 'sold': 100, 'return': 10},
{'sku': 'baz', 'dept': '002', 'sold': 200, 'return': 20},
{'sku': 'foo', 'dept': '003', 'sold': 300, 'return': 0}]