Python 使用列表理解从词典创建词典列表

Python 使用列表理解从词典创建词典列表,python,list,dictionary,list-comprehension,dictionary-comprehension,Python,List,Dictionary,List Comprehension,Dictionary Comprehension,我有一本以下格式的词典: d = {'award1' : { 'nominees': ['name1', 'name2'], 'presenters': ['name3', 'name4'], 'winner' : 'name1' } 'award2' : { 'nominees': ['name5', 'name6'], 'presenters'

我有一本以下格式的词典:

d = {'award1' : { 'nominees': ['name1', 'name2'],
                  'presenters': ['name3', 'name4'],
                  'winner' : 'name1'
                }
     'award2' : { 'nominees': ['name5', 'name6'],
                  'presenters': ['name7', 'name8'],
                  'winner' : 'name6'
                }
    }

我正在尝试创建一个字典列表来分隔这些值,也就是说,结果应该是:

my_list = [ { 'award1': ['name1','name2'], 'award2': ['name5','name6'] },
            { 'award1': ['name3','name4'], 'award2': ['name7','name8'] },
            { 'award1': 'name1', 'award2': 'name6' }
          ]
有没有一种方法可以用一行列表来理解

到目前为止,我所尝试的:

lst = [{key:val['nominees'], key:val['presenters'], key:val['winner']} for key, val in d.items()]
我的代码使用一个普通的“for”循环:

下面是一个列表理解+词典理解版本的一行代码,以实现这一点:

d = {
    'award1' : { 
        'nominees': ['name1', 'name2'],
        'presenters': ['name3', 'name4'],
        'winner' : 'name1'
     },
     'award2' : {
         'nominees': ['name5', 'name6'],
         'presenters': ['name7', 'name8'],
         'winner' : 'name6'
      }
}

# List of keys to maintain the order of elements in the desired list
nested_keys = ['nominees', 'presenters', 'winner']

# In Python 3.7+: If the insertion order of key in initial dict is same as
#                 order of desired list, we can use this to make it more generic
# nested_keys = list(d.values())[0].keys()

new_list = [{k: d[k][key] for k in d.keys()} for key in nested_keys]
其中,
新列表
将保存:

[
    {'award1': ['name1', 'name2'], 'award2': ['name5', 'name6']}, 
    {'award1': ['name3', 'name4'], 'award2': ['name7', 'name8']}, 
    {'award1': 'name1', 'award2': 'name6'}
]
下面是一个列表理解+词典理解版本的一行代码,以实现这一点:

d = {
    'award1' : { 
        'nominees': ['name1', 'name2'],
        'presenters': ['name3', 'name4'],
        'winner' : 'name1'
     },
     'award2' : {
         'nominees': ['name5', 'name6'],
         'presenters': ['name7', 'name8'],
         'winner' : 'name6'
      }
}

# List of keys to maintain the order of elements in the desired list
nested_keys = ['nominees', 'presenters', 'winner']

# In Python 3.7+: If the insertion order of key in initial dict is same as
#                 order of desired list, we can use this to make it more generic
# nested_keys = list(d.values())[0].keys()

new_list = [{k: d[k][key] for k in d.keys()} for key in nested_keys]
其中,
新列表
将保存:

[
    {'award1': ['name1', 'name2'], 'award2': ['name5', 'name6']}, 
    {'award1': ['name3', 'name4'], 'award2': ['name7', 'name8']}, 
    {'award1': 'name1', 'award2': 'name6'}
]

你能分享一下你迄今为止为此所做的努力吗?是的,有一种方法可以通过一个列表来实现。如果您可以将代码与的普通
共享,我们将非常乐意共享列表理解版本。我们只需要查看您为解决此问题所做的努力Dictionary必须具有唯一的密钥。@Anonymous使用我的尝试和for循环进行了更新。您能分享您迄今为止为此所做的尝试吗?是的,有一种方法可以通过一个列表来实现。如果您可以将代码与
的普通
共享,我们将非常乐意共享列表理解版本。我们只需要看看您为解决此问题所做的努力Dictionary必须具有唯一的密钥。@Anonymous使用我的尝试和for循环进行了更新。这是一个很好的答案,但我想指出,对于OP,它在我的系统上的执行速度比OP的代码慢约3倍。600纳秒对1.8微秒可能不会成为瓶颈。但是,如果性能是一个问题,那就值得考虑。将
d.keys()
存储在单独的变量中将临时提高性能这是一个很好的答案,但我想指出,对于OP,这在我的系统上的执行速度比OP的代码慢约3倍。600纳秒对1.8微秒可能不会成为瓶颈。但是,如果性能是一个问题,则值得考虑。将
d.keys()
存储在单独的变量中会提高性能