我正在尝试将功能应用于列表的所有组合。我试图避免使用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
循环的最有效方法是什么?
答案 0 :(得分:2)
您是否尝试过在每种产品的列表理解中应用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']