以元组为键的python嵌套dict理解
我有这样一句话:以元组为键的python嵌套dict理解,python,list-comprehension,Python,List Comprehension,我有这样一句话: { ('name', 'user1'): 'foo', ('user', 'user1'): 'bar', ('name', 'user2'): 'bat', ('user', 'user2'): 'baz' } 我想转换成: { 'user1': {'name': 'foo', 'user': 'bar'}, 'user2': {'name': 'bat', 'user': 'baz'} } 我可以用默认的dict很容易地做到这一点,但我想使用dict理
{ ('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()}}
但用户不在循环内,因此未定义I名称“user”
错误
如何通过听写理解实现这一点?如果键和值与序列中的项目都有直接的一对一关系,则可以使用听写理解 但是,输出值基于输入序列中的多个条目。除非可以在元组键中将项目分组为每秒序列值,否则必须使用
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才会起作用。我认为即使使用嵌套,也无法很好地理解列表。问题是,您希望聚合来自多个项的结果,这需要一个
zip
类型效果。除非我遗漏了什么,否则您要么得到二次时间复杂度和过度复杂度,要么将其编写为一个简单的循环,并附带一些条件。它必须是一个dict理解。你可以用dict理解来实现这一点,但是你必须对值进行预分组,这是不符合要点的。为什么要导入print_函数?我使用python 3.0。如果从将来导入,则打印是一种方法