在python中加入两个字典列表

时间:2017-03-15 14:47:54

标签: python python-2.7 dictionary

鉴于两个词典列表,我想创建一个新的词典列表,其中新列表中的词典具有原始列表中键值对的组合。

我想象一下像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中完成?

1 个答案:

答案 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'}]