在Python中生成列表组合-使用规则
我有两份清单:在Python中生成列表组合-使用规则,python,combinations,itertools,Python,Combinations,Itertools,我有两份清单: list1=[“A”、“B”、“C”、“D”、“E”] 清单2=[“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)不能同时出现在组合中,并且顺序是可逆的(A-B-C-D-E和B-A-E-C-D在内容上是相同的,所以我不需要两者) 如何使用itertools管理它?TL;DR:map('-'.j
list1=[“A”、“B”、“C”、“D”、“E”]
清单2=[“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)不能同时出现在组合中,并且顺序是可逆的(A-B-C-D-E和B-A-E-C-D在内容上是相同的,所以我不需要两者)
如何使用itertools管理它?TL;DR:map('-'.join,product(*zip(列表1,列表2)))
使用
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
的结果解压为产品
的五个独立参数
>>> 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
拥有产品后,产品的每个元素都是'-'的有效参数。加入以在所需集合中创建一个字符串:
>>> 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
我不确定我是否明白你的意思。如果我理解正确,您希望,给定长度为N
的两个列表a
和b
,创建长度为N
的列表,以便I
第个列表是列表a
的副本,但将I
第个条目替换为I
第个列表b
条目?省略AA-B-C-D-E
和A-B-CC-D-E
是否是故意的?输出中是否可以A-BB-CC-D-E
?您的示例输出使我假设给定项最多只允许两个字符列表中的一项。