合并两个具有大部分不同键和值的字典列表
Merging two lists of dictionaries with mostly dissimilar keys and values
我有两个词典列表:
dl1 = [{'symbol': 'ETHBTC', 'price': '0.06081700'}, {'symbol': 'LTCBTC', 'price': '0.00405000'}]
dl2 = [{'symbol': 'ETHBTC', 'makerCommission': '0.001', 'takerCommission': '0.001'}, {'symbol': 'LTCBTC', 'makerCommission': '0', 'takerCommission': '0.001'}]
我想像这样在 symbol
上将它们合并在一起:
{'symbol': 'ETHBTC', 'price': '0.06081700', 'makerCommission': '0.001', 'takerCommission': '0.001'}, {'symbol': 'LTCBTC', 'price': '0.00405000', 'makerCommission': '0', 'takerCommission': '0.001'}
我在这里阅读了有关执行类似操作的各种方法的答案,其中包括 defaultdict()
、列表理解、pandas、extend()
和循环,但我没有没有找到任何描述如何做到这一点的答案,其中两个列表中的每个字典都有不同的键和值,而不是我想要合并的那个。
任何见解表示赞赏。
使用 pandas 非常简单。只需将您的字典转换为数据框并合并,然后再转换回字典。
pd.merge(pd.DataFrame(dl1), pd.DataFrame(dl2), on='symbol').to_dict(orient='records')
[{'symbol': 'ETHBTC',
'price': '0.06081700',
'makerCommission': '0.001',
'takerCommission': '0.001'},
{'symbol': 'LTCBTC',
'price': '0.00405000',
'makerCommission': '0',
'takerCommission': '0.001'}]
你可以使用zip
和字典解包:
dl_merge = [{**d1, **d2} for d1, d2 in zip(dl1, dl2)]
如果列表尚未排序,您必须从第二个列表中找到匹配的元素,最好使用恒定的查找时间:
dl2_aux = {d["symbol"]: d for d in dl2} # assumes each symbol occurs only once
dl_merge = [{**d1, **dl2_aux.get(d1["symbol"], {})} for d1 in dl1]
我有两个词典列表:
dl1 = [{'symbol': 'ETHBTC', 'price': '0.06081700'}, {'symbol': 'LTCBTC', 'price': '0.00405000'}]
dl2 = [{'symbol': 'ETHBTC', 'makerCommission': '0.001', 'takerCommission': '0.001'}, {'symbol': 'LTCBTC', 'makerCommission': '0', 'takerCommission': '0.001'}]
我想像这样在 symbol
上将它们合并在一起:
{'symbol': 'ETHBTC', 'price': '0.06081700', 'makerCommission': '0.001', 'takerCommission': '0.001'}, {'symbol': 'LTCBTC', 'price': '0.00405000', 'makerCommission': '0', 'takerCommission': '0.001'}
我在这里阅读了有关执行类似操作的各种方法的答案,其中包括 defaultdict()
、列表理解、pandas、extend()
和循环,但我没有没有找到任何描述如何做到这一点的答案,其中两个列表中的每个字典都有不同的键和值,而不是我想要合并的那个。
任何见解表示赞赏。
使用 pandas 非常简单。只需将您的字典转换为数据框并合并,然后再转换回字典。
pd.merge(pd.DataFrame(dl1), pd.DataFrame(dl2), on='symbol').to_dict(orient='records')
[{'symbol': 'ETHBTC',
'price': '0.06081700',
'makerCommission': '0.001',
'takerCommission': '0.001'},
{'symbol': 'LTCBTC',
'price': '0.00405000',
'makerCommission': '0',
'takerCommission': '0.001'}]
你可以使用zip
和字典解包:
dl_merge = [{**d1, **d2} for d1, d2 in zip(dl1, dl2)]
如果列表尚未排序,您必须从第二个列表中找到匹配的元素,最好使用恒定的查找时间:
dl2_aux = {d["symbol"]: d for d in dl2} # assumes each symbol occurs only once
dl_merge = [{**d1, **dl2_aux.get(d1["symbol"], {})} for d1 in dl1]