Python +如何合并具有相同键和值的两个字典

时间:2020-11-03 16:33:13

标签: python arrays django dictionary

示例词典

skus = (
    {'sku': '53009', 'qtyonhand': '50'},
    {'sku': '53004', 'qtyonhand': '20'},
    {'sku': '53006', 'qtyonhand': '4'},
    {'sku': '53007', 'qtyonhand': '500'},
    {'sku': '53010', 'qtyonhand': '20'},
    {'sku': '53013', 'qtyonhand': '40'},
    {'sku': '53014', 'qtyonhand': '20'},
)

product_skus = [
    {'sku': '53009', 'line_id': 75128133},
    {'sku': '53004', 'line_id': 75453798},
    {'sku': '53006', 'line_id': 75504454},
    {'sku': '53007', 'line_id': 75504455},
    {'sku': '53010', 'line_id': 75504457},
    {'sku': '53013', 'line_id': 75504658},
    {'sku': '53014', 'line_id': 75504659},
]

尝试在键值对的基础上合并两个词典。 需要基于SKU及其值合并两个字典

Expected Output:
merged_skus = (
    {'sku': '53009', 'qtyonhand': '50', 'line_id': 75128133},
    {'sku': '53004', 'qtyonhand': '20', 'line_id': 75453798},
    {'sku': '53006', 'qtyonhand': '4', 'line_id': 75504454},
    {'sku': '53007', 'qtyonhand': '500', 'line_id': 75504455},
    {'sku': '53010', 'qtyonhand': '20', 'line_id': 75504457},
    {'sku': '53014', 'qtyonhand': '20', 'line_id': 75504659},
    {'sku': '53013', 'qtyonhand': '40', 'line_id': 75504658},
)

3 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

skus = (
    {'sku': '53009', 'qtyonhand': '50'},
    {'sku': '53004', 'qtyonhand': '20'},
    {'sku': '53006', 'qtyonhand': '4'},
    {'sku': '53007', 'qtyonhand': '500'},
    {'sku': '53010', 'qtyonhand': '20'},
    {'sku': '53013', 'qtyonhand': '40'},
    {'sku': '53014', 'qtyonhand': '20'},
)

product_skus = [
    {'sku': '53009', 'line_id': 75128133},
    {'sku': '53004', 'line_id': 75453798},
    {'sku': '53006', 'line_id': 75504454},
    {'sku': '53007', 'line_id': 75504455},
    {'sku': '53010', 'line_id': 75504457},
    {'sku': '53013', 'line_id': 75504658},
    {'sku': '53014', 'line_id': 75504659},
]

lookup = {element["sku"]: element for element in skus}

for product in product_skus:
    lookup[product["sku"]].update(product)

result = tuple(lookup.values())

for element in result:
    print(element)

输出

{'sku': '53009', 'qtyonhand': '50', 'line_id': 75128133}
{'sku': '53004', 'qtyonhand': '20', 'line_id': 75453798}
{'sku': '53006', 'qtyonhand': '4', 'line_id': 75504454}
{'sku': '53007', 'qtyonhand': '500', 'line_id': 75504455}
{'sku': '53010', 'qtyonhand': '20', 'line_id': 75504457}
{'sku': '53013', 'qtyonhand': '40', 'line_id': 75504658}
{'sku': '53014', 'qtyonhand': '20', 'line_id': 75504659}

作为替代:

lookup = {element["sku"]: element for element in skus}
result = tuple({**product, **lookup[product["sku"]]} for product in product_skus)

答案 1 :(得分:1)

我们可以制作一个字典来提高效率,从而可以使用以下命令查找给定sku的第一个集合中的值:

skus_lookup = {
    s['sku']: s for s in skus
}

result = tuple(
    {**s, **skus_lookup[s['sku']] }
    for s in product_skus
)

对于给定的样本数据,这给我们:

>>> pprint(result)
({'line_id': 75128133, 'qtyonhand': '50', 'sku': '53009'},
 {'line_id': 75453798, 'qtyonhand': '20', 'sku': '53004'},
 {'line_id': 75504454, 'qtyonhand': '4', 'sku': '53006'},
 {'line_id': 75504455, 'qtyonhand': '500', 'sku': '53007'},
 {'line_id': 75504457, 'qtyonhand': '20', 'sku': '53010'},
 {'line_id': 75504658, 'qtyonhand': '40', 'sku': '53013'},
 {'line_id': 75504659, 'qtyonhand': '20', 'sku': '53014'})

答案 2 :(得分:0)

您可以用熊猫来做

import pandas as pd

df1=pd.DataFrame(skus)
df2=pd.DataFrame(product_skus)
df3=df1.merge(df2)
res=df3.to_dict(orient='records')

>>> print(res)

[{'sku': '53009', 'qtyonhand': '50', 'line_id': 75128133}, {'sku': '53004', 'qtyonhand': '20', 'line_id': 75453798}, {'sku': '53006', 'qtyonhand': '4', 'line_id': 75504454}, {'sku': '53007', 'qtyonhand': '500', 'line_id': 75504455}, {'sku': '53010', 'qtyonhand': '20', 'line_id': 75504457}, {'sku': '53013', 'qtyonhand': '40', 'line_id': 75504658}, {'sku': '53014', 'qtyonhand': '20', 'line_id': 75504659}]

或单行:

pd.DataFrame(skus).merge(pd.DataFrame(product_skus)).to_dict(orient='records')