如何用Python itertools生成listA元素不重复的两列表配对组合
问题
我有两个列表listA和listB,需要生成所有可能的组合C,满足以下条件:
C由listA的每个元素分别与listB的一个元素配对而成(listB的元素可重复使用)- 每个组合中
listA的元素不会重复出现
现有代码如下:
import itertools listA = [1, 2, 3, 4, 5] listB = ['a', 'b', 'c'] for item in itertools.permutations(x for x in itertools.product(listA,listB)): print(item)
这段代码生成的结果类似:
((1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c'), (4, 'a'), (4, 'b'), (4, 'c'), (5, 'a'), (5, 'b'), (5, 'c'))
但这不符合需求,我期望的输出是每个组合中listA元素不重复的形式,示例如下:
((1, 'a'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a')), ((1, 'b'), (2, 'a'), (3, 'a'), (4, 'a'), (5, 'a')), ((1, 'b'), (2, 'b'), (3, 'a'), (4, 'a'), (5, 'a')), ((1, 'b'), (2, 'b'), (3, 'b'), (4, 'a'), (5, 'a')), ... ((1, 'c'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'c')), ((1, 'a'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'c')), ... ((1, 'c'), (2, 'c'), (3, 'c'), (4, 'c'), (5, 'a')),
解决方案
问题分析
原代码用itertools.permutations处理itertools.product(listA, listB)的结果,这会生成所有元素的排列,必然出现listA元素重复的情况——因为product本身就包含了同一个listA元素和不同listB元素的配对,排列后会重复选取同一个listA元素,完全不符合需求。
该需求本质是:为listA中的每个元素分配一个listB的元素,每个组合必须包含listA的所有元素(每个元素仅出现一次),所有可能的分配方式就是目标组合。
正确代码
直接使用itertools.product对listB生成长度为len(listA)的笛卡尔积,再将每个结果与listA元素一一配对即可:
import itertools listA = [1, 2, 3, 4, 5] listB = ['a', 'b', 'c'] # 生成所有listB元素的长度为len(listA)的笛卡尔积,每个序列对应listA元素的配对值 for b_values in itertools.product(listB, repeat=len(listA)): # 将listA元素与对应b值配对,生成符合要求的组合 combo = tuple(zip(listA, b_values)) print(combo)
代码说明
itertools.product(listB, repeat=len(listA)):生成所有长度等于listA长度的listB元素序列,每个序列代表为listA中每个元素分配的listB值。例如当listA长度为5时,会生成('a','a','a','a','a')、('b','a','a','a','a')等所有可能的组合。tuple(zip(listA, b_values)):将listA的每个元素与b_values中对应位置的元素配对,形成包含所有listA元素且无重复的组合元组,完全符合需求。
内容的提问来源于stack exchange,提问作者Prograde
相关产品推荐
相关产品推荐

