簡體   English   中英

python嵌套dict理解以元組為關鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM