简体   繁体   English

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

[英]Python + How to merge two dictionaries with same key and value

Sample dictionaries示例词典

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

Trying to merge both dictionaries on the basis of the key-value pair.尝试在键值对的基础上合并两个字典。 Need to merge both dictionaries on the basis of SKU and its value需要根据 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},
)

You could do the following:您可以执行以下操作:

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)

Output输出

{'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}

As an alternative:作为备选:

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

We can make a dictionary that boosts efficiency to lookup the values in the first collection for a given sku with:我们可以制作一个字典来提高效率,以便为给定的sku查找第一个集合中的值:

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

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

For the given sample data, this gives us:对于给定的样本数据,这给了我们:

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

You can do it with 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}]

or in one-liner:或单线:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM