itertools和置换将两个列表合并,以便生成所有可能的组合

2024-04-20 01:07:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个列表:aba是包含三个或更多字符串的列表,而b是分隔符列表。你知道吗

我需要生成a的所有可能组合,然后将结果与b的所有可能组合合并(请参见示例以获得更好的理解)。你知道吗

我希望lista中的所有三项都以不同的顺序出现在结果的每一行中(以覆盖或可能的组合)。列表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

因为某些原因它不能正常工作。。你知道吗


Tags: 项目字符串in列表forresultproductword
2条回答

既然你没有自己的代码,我就给你一些想法。如果你想要更多的细节,编辑你的问题,添加一些你自己的工作,然后问细节。你知道吗

当我查看您想要的列表时,您似乎希望列表a中的3个项目没有重复,而列表b中的两个项目可能有重复,并将两个列表中的项目交错。我还将假设列表b中的项目数比给定列表a的长度少一个。(如果这些假设不是您想要的,请在您的问题中明确说明。)

不重复的不同顺序的“组合”称为排列。您可以用表达式获得lista的所有排列

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中的项。当然,你可以反过来做,得到不同的订单。你知道吗


既然您已经展示了自己的一些工作,下面是我的代码。这假设列表ab没有重复。这也简化了问题的处理,即有一个比分隔符多的项我只是在分隔符元组的末尾添加空分隔符""。两个长度(项目和分隔符的长度)相等,每个字符串末尾的空分隔符不起任何作用。你知道吗

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

这可以通过pythonic方式实现,使用permutationsproductcombinations模块来自itertools下面是工作片段:

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

相关问题 更多 >