如何以更具python风格的方式创建包含python字典的列表?

如何以更具python风格的方式创建包含python字典的列表?,python,dictionary,Python,Dictionary,我有以下代码来创建一个字典,它的元素是来自另一个字典的列表: 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].

我有以下代码来创建一个字典,它的元素是来自另一个字典的列表:

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。也许我有点累了,但单线解决方案会很好…

使用:

>>olddict={'Fiesta':{'key':'Ford'},'Golf':{'key':'Volkswagen'},'Bora':{'key':'Volkswagen'}
>>>从集合导入defaultdict
>>>结果=defaultdict(列表)
>>>对于olddict.items()中的k,v:
...     结果[v['key']]。追加(k)
...
>>>结果
defaultdict(,{'Ford':['Fiesta'],'Volkswagen':['Golf','Bora']})

当找到新键时,此方法初始化空列表。从本质上去除代码中的
else
部分。我不确定您是否可以将
defaultdict
与列表理解结合起来,使其成为一行。

使用
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))
如果您使用的是Python2.7或更高版本,还可以使用dict

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