Как получить список из dict с лямбда / картами? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть этот диктант, в котором я управляю списком программ и их разных версий

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())]

ноон генерирует эту ошибку

Ошибка типа: может объединять только str (не "map") в str

Я ценю мнения и исправления

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете использовать понимание списка с f-строками (доступно в Python 3.6 +):

res = [f'{k} {w}' for k, v in data.items() for w in v]

['soft1 v1', 'soft1 v2', 'soft2 v1', 'soft2 v2', 'soft3 v1']

Для более ранних версий Python вы можете использовать str.format:

res = ['{0} {1}'.format(k, w) for k, v in data.items() for w in v]

Это будет более эффективно, так как:

  • Форматированные строковые литералы более эффективны, чем другие методы конкатенации строк.
  • Извлечение пар ключ-значение с помощью dict.items более эффективно, чем итерацияключи и доступ к значениям отдельно.
  • map + lambda с не встроенными функциями менее эффективны, чем списки.
...