我有两个列表: a 和 b 。 a 是包含三个或更多字符串的列表,而 b 是分隔符的列表。
我需要生成 a 的所有可能组合,然后将结果与 b 的所有可能的组合合并(请参见示例以更好地理解)。>
我希望列表 a 中的所有三个项目以不同的顺序出现在结果的每一行中(以覆盖或可能的组合)。不能重复列表 a 中的项目,而可以重复列表 b 中的项目。
我不知道如何使它起作用,因此非常感谢您的帮助。
谢谢!
a = ["test1", "test2", "test3"]
b = ["_", "-", ".", ""]
# Expected result
test1_test2_test3
test2_test1_test3
. . . .
test1_test2-test3
test1_test2.test3
. . . .
test3test2_test1
. . . .
编辑:
from itertools import permutations, combinations, product, chain
a = ["test1", "test2", "test3"]
b = ["_", "-", ".", ""]
a_permutations = permutations(a)
b_permutations = product(b, repeat=len(a)-1)
for ap in a_permutations:
for bp in b_permutations:
result = ''.join([''.join(word) for word in zip(ap, bp)]) + ap[-1]
print result
由于某种原因,它无法正常工作。
答案 0 :(得分:0)
由于您没有显示自己的代码,所以我只给您一些想法。如果您想要更多细节,请编辑问题以添加更多自己的作品,然后询问细节。
当我查看您想要的列表时,您似乎希望列表a
中的3个项目(无重复)和列表b
中的2个项目(可能有重复),并从这两个列表。我还将假设列表b
中的项目数比给定列表a
的长度少一。 (如果这些假设不是您想要的,请在您的问题中明确说明。)
没有重复的具有不同顺序的“组合”称为排列。您可以使用表达式
获得列表a
的所有排列
itertools.permutations(a)
,因此列表b
中所有可能的项目集合,并带有重复项
itertools.product(b, repeat=len(a)-1)
对于每个集合中的每对项目,您可以通过在两个集合上使用zip()
操作来插入这些项目。由于第一个集合的长度比第二个集合的长度长1,因此最后一个项目将被省略,但是您可以将其添加到结果中。
我可以向您展示一个完成这种交织的线,但是我应该给您留点事。使用这些想法尝试自己的代码。如果您没有完全成功,请给我们展示一下尝试,我很高兴为您展示一些最终代码。
请注意,遵循我的想法将导致列表的显示顺序与您显示的顺序不同。我会得到的列表将从
开始test1_test2_test3
test1_test3_test2
test2_test1_test3
test2_test3_test1
test3_test1_test2
test3_test2_test1
test1_test2-test3
test1_test3-test2
test2_test1-test3
test2_test3-test1
test3_test1-test2
test3_test2-test1
test1_test2.test3
,依此类推。此顺序修复分隔符,然后排列列表a
中的项目。当然,您可以反过来做,并获得不同的订单。
现在您已经展示了自己的一些作品,这是我的代码。假设列表a
和b
没有重复。这也起到了简化技巧的作用,该问题比分隔符多了一个项目-我只是将空分隔符""
添加到分隔符元组的末尾。然后,两个长度(项和分隔符的长度)相等,并且每个字符串末尾的空分隔符不起作用。
import itertools
a = ["test1", "test2", "test3"]
b = ["_", "-", ".", ""]
for separators in itertools.product(b, repeat=len(a) - 1):
for items in itertools.permutations(a):
print("".join(v for pair in zip(items, separators + ("",)) for v in pair))
此代码提供打印输出
test1_test2_test3
test1_test3_test2
test2_test1_test3
test2_test3_test1
test3_test1_test2
test3_test2_test1
test1_test2-test3
test1_test3-test2
test2_test1-test3
test2_test3-test1
test3_test1-test2
test3_test2-test1
test1_test2.test3
test1_test3.test2
test2_test1.test3
test2_test3.test1
test3_test1.test2
test3_test2.test1
test1_test2test3
test1_test3test2
test2_test1test3
test2_test3test1
test3_test1test2
test3_test2test1
test1-test2_test3
test1-test3_test2
test2-test1_test3
test2-test3_test1
test3-test1_test2
test3-test2_test1
test1-test2-test3
test1-test3-test2
test2-test1-test3
test2-test3-test1
test3-test1-test2
test3-test2-test1
test1-test2.test3
test1-test3.test2
test2-test1.test3
test2-test3.test1
test3-test1.test2
test3-test2.test1
test1-test2test3
test1-test3test2
test2-test1test3
test2-test3test1
test3-test1test2
test3-test2test1
test1.test2_test3
test1.test3_test2
test2.test1_test3
test2.test3_test1
test3.test1_test2
test3.test2_test1
test1.test2-test3
test1.test3-test2
test2.test1-test3
test2.test3-test1
test3.test1-test2
test3.test2-test1
test1.test2.test3
test1.test3.test2
test2.test1.test3
test2.test3.test1
test3.test1.test2
test3.test2.test1
test1.test2test3
test1.test3test2
test2.test1test3
test2.test3test1
test3.test1test2
test3.test2test1
test1test2_test3
test1test3_test2
test2test1_test3
test2test3_test1
test3test1_test2
test3test2_test1
test1test2-test3
test1test3-test2
test2test1-test3
test2test3-test1
test3test1-test2
test3test2-test1
test1test2.test3
test1test3.test2
test2test1.test3
test2test3.test1
test3test1.test2
test3test2.test1
test1test2test3
test1test3test2
test2test1test3
test2test3test1
test3test1test2
test3test2test1
答案 1 :(得分:0)
可以使用以下permutations
中的product
,combinations
和itertools
模块以pythonic的方式来实现这一目的:
from itertools import permutations, combinations, product
a = ["test1", "test2", "test3"]
b = ["_", "-", ".", ""]
for com in combinations(b, len(a) - 1):
for per in product(com, repeat=len(a) - 1):
for ear_per in permutations(a):
out = ''.join(map(''.join, zip(list(ear_per[:-1]), per)))
print(out + list(ear_per)[-1])