【问题标题】:Creating list of dictionaries from a dictionary using list comprehension使用列表推导从字典创建字典列表
【发布时间】:2021-05-01 20:37:11
【问题描述】:

我有一本格式如下的字典:

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”循环:

nominees, winner, presenters = {}, {}, {}
    for key, val in d.items():
        nominees[key] = val['nominees']
        winner[key] = val['winner']
        presenters[key] = val['presenters']
lst = [nominees, winner, presenters]

【问题讨论】:

  • 你能分享一下你迄今为止为此做了什么吗?是的,有一种方法可以通过一个列表理解来实现它。如果您可以与普通的for 分享代码,我们将更乐意分享列表理解 版本。我们只需要看看你为解决这个问题所做的努力
  • 字典必须有唯一键..
  • @Anonymous 更新了我的尝试和 for 循环。

标签: python list dictionary list-comprehension dictionary-comprehension


【解决方案1】:

这里有一个 列表理解 + 字典理解 版本的单行代码来实现这一点:

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]

new_list 的位置:

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

【讨论】:

  • 这是一个很好的答案,但我想为 OP 指出,它在我的系统上的执行速度比 OP 的代码慢约 3 倍。 600 纳秒与 1.8 微秒可能不会成为瓶颈。但如果性能是一个问题,则值得考虑。
  • d.keys() 存储在单独的变量中会提高性能
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2018-12-17
  • 2019-02-13
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多