Применить функцию ко всем комбинациям двух списков, используя map()

Я пытаюсь применить функцию ко всем комбинациям списков. Я стараюсь избегать использования циклов 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 снова и снова?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
883
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пробовали ли вы применять 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 12.06.2019 18:10

@Jon Вам все еще нужно формировать продукты, поэтому вы не можете избежать квадратичной сложности. Генераторы списков ускоряют обработку продуктов, поскольку они оптимизированы для создания списков. Итак, чтобы ответить на ваш вопрос, да, насколько мне известно.

cs95 12.06.2019 18:11

Другие вопросы по теме