【问题标题】:Left join on list of dictionaries左连接字典列表
【发布时间】:2021-01-05 19:59:39
【问题描述】:

我正在尝试根据条件l1.name = l2.name 对 2 个字典 l1 和 l2 列表进行左连接。如果条件匹配,则将 l2 dict 中的附加键添加到 l1 dict,否则 l1 dict 保持原样。

输入

l1 =[{'id': 'id1', 'name': 'value1'}, {'id': 'id2', 'name': 'value2'}, {'id': 'id3', 'name': 'value3'}]
l2 =[{'key': 'key1', 'name': 'value1'},{'key': 'key2', 'name': 'value9'}]

预期输出

result = [{'id': 'id1', 'name': 'value1', 'key': 'key1'}, {'id': 'id2', 'name': 'value2'}, {'id': 'id3', 'name': 'value3'}]

到目前为止的代码只产生匹配的条目。我需要按原样添加来自 l1 的不匹配的字典。

from collections import defaultdict

d = defaultdict(list)
for dct in l1:
    d[dct["name"]].append(dct)

result = [{**d1, **d2} for d2 in l2 for d1 in d[d2.pop("l2name")]]

【问题讨论】:

  • 遍历l2 中的所有内容,如果不存在则添加到l1。这是微不足道的。
  • 我认为您没有正确阅读/理解这个问题。我不需要合并列表。我需要加入每个列表的字典中的元素...为清楚起见,请查看预期的输出。

标签: python python-3.x list dictionary join


【解决方案1】:

您可以使用生成器表达式来获取具有相同值的 dict,然后它们会更新第一个

l1 =[{'id': 'id1', 'name': 'value1'}, {'id': 'id2', 'name': 'value2'}, {'id': 'id3', 'name': 'value3'}]
l2 =[{'key': 'key1', 'name': 'value1'},{'key': 'key2', 'name': 'value9'}]

for l1_item in l1:
   l2_item = next((item for item in l2 if l1_item['name'] == item['name']), None)
   if(l2_item):
       l1_item.update(l2_item)

print(l1) #[{'id': 'id1', 'name': 'value1', 'key': 'key1'}, {'id': 'id2', 'name': 'value2'}, {'id': 'id3', 'name': 'value3'}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多