在Python中生成列表组合-有规则

我有两个清单:

list1 = ["A", "B", "C", "D", "E"]
list2 = ["AA", "BB", "CC", "DD", "EE"]

我想创建所有可能的组合,如下所示:

    A-B-C-D-E
    A-BB-C-D-E
    A-B-C-DD-E...etc.

规则是两个相似的字母(如A-AA,B-BB)不能同时在组合中,并且顺序是可逆的(ABCDE和BAECD内容相同,所以我不需要它们两个都)

如何使用 itertools 管理它?

回答

特尔;博士:map('-'.join, product(*zip(list1, list2)))


使用 using 相对简单itertools,但您必须仔细考虑每一步。

首先,您可以将两个列表压缩在一起以获得一系列元组。最终结果中的每个元素都将包含每个元组中的一个选项。

>>> list1 = ["A", "B", "C", "D", "E"]
>>> list2 = ["AA", "BB", "CC", "DD", "EE"]
>>> list(zip(list1, list2))
[('A', 'AA'), ('B', 'BB'), ('C', 'CC'), ('D', 'DD'), ('E', 'EE')]

接下来,我们需要五个元组中每个元组的笛卡尔积。这为我们提供了 32 种不同的方式来选择 A 或 AA 之一,然后选择 B 或 BB 等。为此,我们使用*将 的结果解包zip为 的五个独立参数product

>>> from itertools import product
>>> for x in product(*zip(list1, list2)):
...   print(x)
...
('A', 'B', 'C', 'D', 'E')
('A', 'B', 'C', 'D', 'EE')
('A', 'B', 'C', 'DD', 'E')
('A', 'B', 'C', 'DD', 'EE')
('A', 'B', 'CC', 'D', 'E')
('A', 'B', 'CC', 'D', 'EE')
('A', 'B', 'CC', 'DD', 'E')
# etc

一旦你有了产品,产品的每个元素都是一个有效的参数,'-'.join用于在你想要的集合中创建一个字符串:

>>> for x in map('-'.join, product(*zip(list1, list2))):
...   print(x)
...
A-B-C-D-E
A-B-C-D-EE
A-B-C-DD-E
A-B-C-DD-EE
A-B-CC-D-E
A-B-CC-D-EE
A-B-CC-DD-E
A-B-CC-DD-EE
A-BB-C-D-E
A-BB-C-D-EE
A-BB-C-DD-E
A-BB-C-DD-EE
A-BB-CC-D-E
A-BB-CC-D-EE
A-BB-CC-DD-E
A-BB-CC-DD-EE
AA-B-C-D-E
AA-B-C-D-EE
AA-B-C-DD-E
AA-B-C-DD-EE
AA-B-CC-D-E
AA-B-CC-D-EE
AA-B-CC-DD-E
AA-B-CC-DD-EE
AA-BB-C-D-E
AA-BB-C-D-EE
AA-BB-C-DD-E
AA-BB-C-DD-EE
AA-BB-CC-D-E
AA-BB-CC-D-EE
AA-BB-CC-DD-E
AA-BB-CC-DD-EE


以上是在Python中生成列表组合-有规则的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>