我有一个像这样的字典:

{ ('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错误。

如何通过dict理解实现这一目标?

最佳答案

如果键和值都与序列中的项目具有直接的一对一关系,则可以使用dict理解。

但是,您的输出值基于输入序列中的多个条目。除非您可以在元组键中将项目分组为每秒的序列值,否则必须使用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

关于python - python以元组为键的嵌套dict理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16425744/

10-12 17:03