在python中连接两个词典列表

在python中连接两个词典列表,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,给定两个字典列表,我想创建一个新的字典列表,其中新列表中的字典具有来自原始列表的键值对的组合 我在想象SQL中的左连接 以下是我的两个列表的示例: DictList1 = [{workbookname: workbook1, groupid: id1, capabilityname: capability1}, {workbookname: workbook1, groupid: id1, capabilityname: capability2} , ...] DictList2 = [{gr

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

我在想象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}
, ...]
所以

  • 对于
    目录1
    中的每个词典
  • 我会搜索
    DictList2
    ,直到在
    groupid
    上找到匹配项
  • 然后我会将groupname键值对附加到该字典中
  • 并将其存储在
    NewList

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

要有效地做到这一点,您需要首先将其中一个列表映射到由组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
值是唯一的,并且您希望为
DictList1
中的每个词典在
combined
中创建输出,即使
DictList2
中没有匹配的
groupid

演示:


我已经实现了单独的函数,但是我得到了错误类型错误:列表索引必须是整数,而不是最后一行的str(在我的main中)。@JeremyReal:这表明
d
是列表对象,而不是字典。您确定在
DictList1
中只有字典吗?我想可能是两个带有字典的列表,比如[{}]],其中最外层的列表除了内部列表之外是空的。我不知道我是怎么做到的,但这可能就是问题所在。我会检查的。谢谢这解决了问题,但现在我得到了错误类型error:“generator”对象没有属性“get_item”@JeremyReal:
\Uuuu getitem\Uuu
用于
[…]
项访问语法。您仍然没有字典,
d['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'}]