[英]python nested dict comprehension with tuple as key
我有这样的字典:
{ ('name', 'user1'): 'foo',
('user', 'user1'): 'bar',
('name', 'user2'): 'bat',
('user', 'user2'): 'baz' }
我想转换为:
{ 'user1': {'name': 'foo', 'user': 'bar'},
'user2': {'name': 'bat', 'user': 'baz'} }
我可以使用默认的dict轻松完成此操作,但我想使用dict理解。
到目前为止,我有:
{user: {key:value for (key, user), value in my_dict.items()}}
但是用户不在循环内部,所以我name 'user' is not defined
错误。
如何通过词典理解实现这一目标?
如果键和值都与序列中的项具有直接的一对一关系,则可以使用字典理解。
但是,输出值基于输入序列中的多个条目。 除非您可以将项目分组为元组键中的每秒序列值,否则必须使用defaultdict
设置。
使用itertools.groupby()
肯定可以进行分组,但这需要排序,与defaultdict
plus循环解决方案相比,性能降低。
使用itertools.groupby
:
from itertools import groupby
user = lambda item: item[0][1]
{user: {key[0]: value for key, value in grouped}
for user, grouped in groupby(sorted(my_dict.items(), key=user), key=user)}
输出演示:
>>> {user: {key[0]: value for key, value in grouped}
... for user, grouped in groupby(sorted(my_dict.items(), key=user), key=user)}
{'user2': {'name': 'bat', 'user': 'baz'}, 'user1': {'name': 'foo', 'user': 'bar'}}
这是一个O(n log n)解决方案,而不是defaultdict
解决方案的O(n)复杂性:
from collections import defaultdict
output = defaultdict(dict)
for (key, user), value in my_dict.iteritems():
output[user][key] = value
这工作正常:
from __future__ import print_function
from itertools import groupby
from operator import itemgetter
d=dict({('name', 'user1'): 'foo', ('user', 'user1'): 'bar',
('name', 'user2'): 'bat',
('user', 'user2'): 'baz' })
l = []
for key, val in d.items() :
l.append([key[1], key[0], val])
l.sort(key=itemgetter(0))
d_ = dict()
for key, group in groupby(l, lambda x: x[0]):
dic = dict()
for thing in group:
dic[thing[1]] = thing[2]
d_[key] = dic
请注意,只有列表先前已排序,来自itertools的groupby才会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.