爲了有效地做到這一點,你需要首先映射列表中的一個由組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}
。
所有這些假設在DictList2
groupid
值獨特,並且要在DictList1
爲創造combined
輸出每字典,即使在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'}]
我已經實現了獨立的功能,但我得到的錯誤類型錯誤:列表索引必須是整數,而不是str的在最後一行(在我的主)。 –
@JeremyReal:它表示'd'是一個列表對象,而不是字典。你確定你只有'DictList1'中的字典嗎? –
我認爲它可能是兩個與字典的列表,如[[{}]],其中最外面的列表是空的,除了內部列表。我不知道我是怎麼做到的,但這可能是問題所在。我會查一下。謝謝! –