合并多个词典列表并重命名该键

时间:2014-02-12 03:56:58

标签: python dictionary

合并两个列表词典的最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,它并没有完全符合我的要求:

  1. 我需要通过多个键合并,即sku和dept
  2. 我必须将数量重命名为出售并分别从2个字典列表中返回。
  3. 我尝试了类似下面的内容但却无法正常工作:

    result = [
        s['return'] = r['qty'] 
        for s in sold 
        for r in return 
        if s['sku'] == r['sku'] and s['dept'] == r['dept']]
    

    由于

1 个答案:

答案 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}]