2014-09-03 41 views
0

我有以下代碼來創建一個字典元素也都是從其他詞典:如何用更pythonic的方式創建這個包含列表的python字典?

olddict={'Fiesta': {'key':'Ford'},'Golf': {'key':'Volkswagen'}, 'Bora': {'key':'Volkswagen'} } 
newdict = {} 
for key, value in olddict.items(): 
    newkey = value['key'] 
    if newkey in newdict: 
     newdict[newkey].append(key) 
    else: 
     newdict[newkey] = [key] 

的代碼工作正常,但似乎完全不符合Python。也許我有點累了,但一個行的解決方案將是巨大的......

回答

2

使用defaultdict()

>>> olddict={'Fiesta': {'key':'Ford'},'Golf': {'key':'Volkswagen'}, 'Bora': {'key':'Volkswagen'} } 
>>> from collections import defaultdict 

>>> result = defaultdict(list) 
>>> for k, v in olddict.items(): 
...  result[v['key']].append(k) 
... 

>>> result 
defaultdict(<type 'list'>, {'Ford': ['Fiesta'], 'Volkswagen': ['Golf', 'Bora']}) 

這種方法時,一個新的關鍵是找到初始化一個空列表。基本上擺脫你的代碼中的else部分。我不確定你可以結合defaultdict與列表理解,使其成爲一個單線程。

0

使用itertools.groupby

from itertools import groupby as g 
keyfunc = lambda x: olddict[x]['key'] 
newdict = dict((k, list(vs)) for k, vs in g(sorted(olddict, key=keyfunc), keyfunc)) 

如果您使用Python 2.7或更高版本,您還可以使用字典理解

newdict = { k: list(vs) for k, vs in g(sorted(olddict, key=keyfunc), keyfunc) } 
相關問題