【问题标题】:itertools and permutations - Merge two lists in order to make all possible combinationsitertools and permutations - 合并两个列表以进行所有可能的组合
【发布时间】:2019-09-02 15:47:35
【问题描述】:

我有两个列表:aba 是一个包含三个或更多字符串的列表,而 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

由于某种原因它无法正常工作..

【问题讨论】:

  • 考虑到 b 包含 4 个或更多分隔符,并且只有 len(a) - 1 个分隔符适合单个结果,我不知道如何处理。
  • 我希望列表 a 中的所有三个项目以不同的顺序出现在结果的每一行中(以便覆盖或可能的组合)。列表 a 中的项目不能重复,而列表 b 中的项目可以重复。

标签: python python-2.7 permutation


【解决方案1】:

这可以通过使用来自itertoolspermutationsproductcombinations 模块以pythonic 方式实现,下面是工作的sn-p:

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

【讨论】:

  • @RoryDaulton 我已对其进行了更新以说明所需的输出,并且对我提出的要求很清楚,因此我提供了解决方案。希望没问题!
  • 它正在工作。但它错过了行中重复的分隔符。例如:test1_test2_test3
  • 好的!我以为你不想要那个,所以不包括在内。更新以支持相同。
  • 这里有问题。如果我运行“python test.py | grep test1test2test3”,它会给我 3 个结果。我需要所有生成的字符串都是唯一的。
  • 此外,如果 len(a) 大于 len(b) + 1,则它不起作用。
【解决方案2】:

由于您没有展示您自己的代码,我只是给您一些想法。如果您需要更多详细信息,请编辑您的问题以添加更多您自己的工作,然后询问详细信息。

当我查看您想要的列表时,您似乎想要列表 a 中的 3 个项目,不重复,以及列表 b 中的两个项目,可能重复,并将两个列表中的项目交错。我还将假设列表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 中的项目。当然,你也可以反过来做,得到不同的顺序。


现在您已经展示了自己的一些工作,这是我的代码。这假定列表 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多