在python中连接两个词典列表

2024-05-14 12:41:34 发布

您现在位置:Python中文网/ 问答频道 /正文

给定两个字典列表,我想创建一个新的字典列表,其中新列表中的字典具有来自原始列表的键值对的组合。你知道吗

我在想象SQL中的左连接。你知道吗

下面是我的两个列表的示例:

DictList1 = [{workbookname: workbook1, groupid: id1, capabilityname: capability1}, 
{workbookname: workbook1, groupid: id1, capabilityname: capability2}
, ...]
DictList2 = [{groupid: id1, groupname: name1}
, {groupid: id2, groupname, name2}
, ...]
NewList = [{workbookname: workbook1, groupname: name1, capabilityname: capability1}
, {workbookname: workbook1, groupname: name1, capabilityname: capability2}
, ...]

所以呢

  • 对于DictList1中的每个字典
  • 我会在DictList2中搜索,直到在groupid中找到匹配项。你知道吗
  • 然后将groupname键值对附加到字典中
  • 把它储存在NewList。你知道吗

这在Python中是可以做到的吗?你知道吗


Tags: 列表字典键值name1id1groupnamegroupidnewlist
1条回答
网友
1楼 · 发布于 2024-05-14 12:41:34

要有效地执行此操作,首先需要将其中一个列表映射到按组id键控的字典:

by_group = {}
for d in DictList2:
    by_group[d['groupid']] = d

现在可以从第二个列表生成输出:

combined = [dict(by_group.get(d['groupid'], {}), **d) for d in DictList1]

我使用了一个鲜为人知的技巧,将两个字典组合成一个新的字典,其中dict()创建由groupid值找到的字典的副本,然后使用d作为关键字参数来更新副本。如果您发现难以阅读,请使用单独的函数:

def merge_dicts(*dicts):
    res = {}
    for d in dicts:
        res.update(d)
    return res

combined = [merge_dicts(by_group.get(d['groupid'], {}), d) for d in DictList1]

python3.5或更新版本有一个专用的合并语法{**by_group.get(d['groupid'], {}), **d}。你知道吗

所有这些都假设DictList2中的groupid值是唯一的,并且您希望在combined中为DictList1中的每个字典创建输出,即使DictList2中没有匹配的groupid值。你知道吗

演示:

>>> DictList1 = [
...     {'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability1'},
...     {'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability2'},
... ]
>>> DictList2 = [{'groupid': 'id1', 'groupname': 'name1'}, {'groupid': 'id2', 'groupname': 'name2'}]
>>> by_group = {}
>>> for d in DictList2:
...     by_group[d['groupid']] = d
...
>>> def merge_dicts(*dicts):
...     res = {}
...     for d in dicts:
...         res.update(d)
...     return res
...
>>> [merge_dicts(by_group.get(d['groupid'], {}), d) for d in DictList1]
[{'groupname': 'name1', 'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability1'}, {'groupname': 'name1', 'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability2'}]
>>> from pprint import pprint
>>> pprint(_)
[{'capabilityname': 'capability1',
  'groupid': 'id1',
  'groupname': 'name1',
  'workbookname': 'workbook1'},
 {'capabilityname': 'capability2',
  'groupid': 'id1',
  'groupname': 'name1',
  'workbookname': 'workbook1'}]

相关问题 更多 >

    热门问题