鉴于两个词典列表,我想创建一个新的词典列表,其中新列表中的词典具有原始列表中键值对的组合。
我想象一下像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
的匹配项。 NewList
。这是否可以在Python中完成?
答案 0 :(得分:0)
要有效地执行此操作,您需要先将其中一个列表映射到由组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]
Python 3.5或更新版本具有专用的合并语法{**by_group.get(d['groupid'], {}), **d}
。
所有这些都假定groupid
中的DictList2
值唯一,并且您希望在combined
中为每个 DictList1
中的词典,即使groupid
中没有匹配的DictList2
值。
演示:
>>> 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'}]