合并两个具有大部分不同键和值的字典列表

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]