我试图弄清楚如何遍历列表列表并从左到右记录列表中的所有可能组合。第一个列表始终是组合的第一个位置,第二个列表将是第二个位置,等等。
如果假设第一个列表始终是相同的字母,我将如何得到所有可能的字母组合。到目前为止,我的代码确实隔离了第一组,但我无法将其余部分附加到列表中以创建组合。
listoflists = [[a,b,c,d][e,f,g][h,i]]
for i in range(len(listoflists[]):
for j in range(len(listoflists[i])):
if(i==0):
print(listoflists[i][j])
newlist[i].append([listoflists[i][j]])
else:
print(i)
print(listoflists[i][j])
#newlist[[i[j]].append([listoflists[i][j]])
最后一行代码抛出一个错误,print语句用于调试。那么我将如何使用for循环获得列表列表的所有组合
答案 0 :(得分:1)
该过程称为cartesian product:
在数学中,笛卡尔积是一种数学运算 从多个集合返回集合(或产品集或简单产品)。 也就是说,对于集合A和B,笛卡尔乘积A×B是集合 所有有序对(a,b),其中a∈A和b∈B。
python中已经存在一个库函数,即itertools.product
:
itertools.product(* iterables [,repeat])输入的笛卡尔积 iterables。
等效于生成器表达式中的嵌套for循环。例如, 对于B中的y,product(A,B)返回与(x,y)中的x相同的返回值。
当您将其应用到列表中时,您将获得所需的结果:
>>> import itertools
>>> ll = [["a","b","c","d"], ["e","f","g"], ["h","i"]]
>>> list(itertools.product(*ll))
[('a', 'e', 'h'), ('a', 'e', 'i'), ('a', 'f', 'h'), ('a', 'f', 'i'), ('a', 'g', 'h'), ('a', 'g', 'i'), ('b', 'e', 'h'), ('b', 'e', 'i'), ('b', 'f', 'h'), ('b', 'f', 'i'), ('b', 'g', 'h'), ('b', 'g', 'i'), ('c', 'e', 'h'), ('c', 'e', 'i'), ('c', 'f', 'h'), ('c', 'f', 'i'), ('c', 'g', 'h'), ('c', 'g', 'i'), ('d', 'e', 'h'), ('d', 'e', 'i'), ('d', 'f', 'h'), ('d', 'f', 'i'), ('d', 'g', 'h'), ('d', 'g', 'i')]