Я пытаюсь применить функцию ко всем комбинациям списков. Я стараюсь избегать использования циклов for
, так как в программе, которую я пытаюсь написать, я получил бы 5 или более вложенных циклов. Одно предложение, которое у меня было, состояло в том, чтобы использовать функцию map(), но, похоже, я не могу заставить ее работать.
Некоторые примеры:
Для простоты у меня есть функция, которая удаляет дефис из строки и добавляет суффикс в конец строки:
def changeString(item, suffix):
foo = item.replace("-", "")
bar = foo + suffix
return bar
items = ["Hel-lo", "Wor-ld", "-test-"]
suffixes = ["41", "2", "5"]
Чтобы добиться желаемого поведения, я могу использовать:
foobar = []
for item in items:
for suffix in suffixes:
foobar.append(changeString(item, suffix))
который дает вывод:
['Hello41', 'Hello2', 'Hello5', 'World41', 'World2', 'World5', 'test41', 'test2', 'test5']
Это результат, который я хочу, но я не хочу, чтобы вложенные циклы были такими.
Я попытался использовать map(), чтобы избежать вложенных циклов for
, что выглядит так:
foobar = list( map( changeString, items, suffixes ) )
Но это дает неправильный результат:
['Hello41', 'World2', 'test5']
Я также пытался использовать itertools.product
как таковой:
lst = [items, suffixes]
foobar = list(itertools.product(*lst))
но это дает результат:
[('Hel-lo', '41'), ('Hel-lo', '2'), ('Hel-lo', '5'), ('Wor-ld', '41'), ('Wor-ld', '2'), ('Wor-ld', '5'), ('-test-', '41'), ('-test-', '2'), ('-test-', '5')]
что мне кажется, что мне нужно использовать больше циклов, чтобы его можно было использовать функцией, которую я определил выше.
Каков наиболее эффективный способ применить мою функцию ко всем возможным комбинациям строк, избегая вложенных циклов for
снова и снова?
Пробовали ли вы применять changeString
в понимании списка для каждого продукта?
from itertools import product
[changeString(*p) for p in product(items, suffixes)]
# ['Hello41', 'Hello2', 'Hello5', 'World41', ..., 'test2', 'test5']
Или, для лучшей читабельности,
[changeString(item, suffix) for (item, suffix) in product(items, suffixes)]
# ['Hello41', 'Hello2', 'Hello5', 'World41', ..., 'test2', 'test5']
@Jon Вам все еще нужно формировать продукты, поэтому вы не можете избежать квадратичной сложности. Генераторы списков ускоряют обработку продуктов, поскольку они оптимизированы для создания списков. Итак, чтобы ответить на ваш вопрос, да, насколько мне известно.
Ах, это то, что я искал, спасибо. Тем более, что его можно расширить на другие переменные помимо элемента и суффикса. Это самый эффективный способ работать с комбинациями и вводить их в функцию?