Python 如何使用lambda/maps从dict获取列表?

Python 如何使用lambda/maps从dict获取列表?,python,python-3.x,python-2.7,list,list-comprehension,Python,Python 3.x,Python 2.7,List,List Comprehension,我有一份口述, 在这里,我管理程序及其不同版本的列表 data = { 'soft1':{ 'v1':{...}, 'v2':{...} }, 'soft2':{ 'v1':{...}, 'v2':{...} }, 'soft3':{ 'v1':{...} }, ... } 现在我需要一个列表,如下所示: list_=[ 'soft1 v1', 'soft1 v2', 'soft2 v1',

我有一份口述, 在这里,我管理程序及其不同版本的列表

data = {
  'soft1':{
     'v1':{...},
     'v2':{...}
   },
  'soft2':{
     'v1':{...},
     'v2':{...}
  },
  'soft3':{
     'v1':{...}
  },
  ...
}
现在我需要一个列表,如下所示:

list_=[
    'soft1 v1',
    'soft1 v2',
    'soft2 v1',
    'soft2 v2',
    'soft3 v1' 
]
具有列表理解能力

list_ = [soft + " " + ver for soft in data.keys() for ver in data[soft].keys()]
但是我想要一个更有效的方法和更通灵的方法

我尝试:

list_ = [map(lambda soft: map(lambda ver: [soft + " " + ver], data[soft].keys()), data.keys())]
但它产生了这个错误

TypeError:只能将str(而不是“映射”)连接到str


我感谢您的意见和更正

您可以使用带有f字符串的列表理解(在Python 3.6+中提供):

对于Python的早期版本,可以使用
str.format

res = ['{0} {1}'.format(k, w) for k, v in data.items() for w in v]
这将更有效率,因为:

  • 格式化字符串文字比其他字符串连接方法更有效
  • 通过
    dict.items
    提取键值对比分别迭代键和访问值更有效
  • 带有非内置函数的
    map
    +
    lambda
    比列表理解效率低

您可以将列表理解与f字符串一起使用(在Python 3.6+中提供):

对于Python的早期版本,可以使用
str.format

res = ['{0} {1}'.format(k, w) for k, v in data.items() for w in v]
这将更有效率,因为:

  • 格式化字符串文字比其他字符串连接方法更有效
  • 通过
    dict.items
    提取键值对比分别迭代键和访问值更有效
  • 带有非内置函数的
    map
    +
    lambda
    比列表理解效率低

列表理解是最大的Pythic方法。列表理解是Pythic最接近的方法。Shank,您的意见允许我读一个更可读和灵活的代码。@ 4L3X,没问题,如果这有助于考虑(左边的绿色刻度)。如果这有助于考虑(绿色蜱在左边)。