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



示例字典

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},
)

您可以执行以下操作:

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)

我们可以制作一个字典,用来提高查找给定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'})

您可以使用pandas:

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')

最新更新