Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以元组为键的python嵌套dict理解_Python_List Comprehension - Fatal编程技术网

以元组为键的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。如果从将来导入,则打印是一种方法