2013-06-21 158 views
0

我有字典的以下列表:如何將python字典列表轉換爲dictonary的新列表?

list1 = [ 
      { 'n1': ('e1','e2','e3') }, 
      { 'n2': ('e1','e2') }, 
      { 'n3': ('e2','e3','e4') } 
     ] 

,我需要把它改造成:

list2 = [ 
      { 'e1': ('n1','n2') }, 
      { 'e2': ('n1','n2','n3') }, 
      { 'e3': ('n3',) }, 
      { 'e4': ('n3',) } 
     ] 

是否有任何短期和智能的方法來做到這一點?

+0

爲什麼不使用單個詞典而不是詞典列表?每個'e *'或'n *'鍵的查找要求您循環搜索每次搜索的列表,使得單個元素的字典變得冗餘和無用。 –

+0

你是絕對正確的 - 這解決了這個問題。列表不會令人驚歎。 – user2510051

+0

結果'list2'是否有錯誤?不應該第三個字典是'{'e3':('n1','n3',)}'? – oleg

回答

0

事情是這樣的:

>>> from itertools import chain 
>>> from collections import defaultdict 
>>> vals = set(chain.from_iterable(y for x in list1 for y in x.values())) 
>>> dic = defaultdict(list) 
>>> for x in vals: 
...  for y in list1: 
...   for k,v in y.items(): 
...    if x in v: 
...     dic[x].append(k) 
...     
>>> dic 
defaultdict(<type 'list'>, 
{'e4': ['n3'], 
'e1': ['n1', 'n2'], 
'e3': ['n1', 'n3'], 
'e2': ['n1', 'n2', 'n3']}) 
0

我覺得setdefault可以在這個任務對您有用。 如果您需要字典作爲結果。你可以使用這樣的東西。

res = {} 
for d in list1: 
    for k, v in d.iteritems(): 
     for i in v: 
      res.setdefault(i, []).append(k) 

如果您需要字典的列表中,您可以在此

res = [{k:v} for k, v in res.iteritems()] 

後使用列表理解如果你堅持列表作爲值在最後一個列表comrehensions投名單,元組

res = [{k: tuple(v)} for k, v in res.iteritems()] 
相關問題