Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中生成列表组合-使用规则_Python_Combinations_Itertools - Fatal编程技术网

在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
?您的示例输出使我假设给定项最多只允许两个字符列表中的一项。