2017-03-15 49 views
-1

給定兩個詞典列表,我想創建一個新的詞典列表,其中新列表中的詞典具有來自原始列表的鍵值對的組合。在Python中加入兩個詞典列表

我想像在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中做的事嗎?

回答

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}

所有這些假設在DictList2groupid獨特,並且要在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'}] 
+0

我已經實現了獨立的功能,但我得到的錯誤類型錯誤:列表索引必須是整數,而不是str的在最後一行(在我的主)。 –

+0

@JeremyReal:它表示'd'是一個列表對象,而不是字典。你確定你只有'DictList1'中的字典嗎? –

+0

我認爲它可能是兩個與字典的列表,如[[{}]],其中最外面的列表是空的,除了內部列表。我不知道我是怎麼做到的,但這可能是問題所在。我會查一下。謝謝! –