在python中连接两个词典列表
给定两个字典列表,我想创建一个新的字典列表,其中新列表中的字典具有来自原始列表的键值对的组合 我在想象SQL中的左连接 以下是我的两个列表的示例:在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
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'}]