所以我脑子里有一个问题,我试图用迭代而不是递归的方式来解决,但尽管看起来很简单,但这个解决方案似乎让我很困惑。
假设我有两个列表
l1 = [a,b,c] l2 = [1,2,3]
我想要一个列表,其中元素都是l1和l2对的可能列表。因此,将如下所示:
[ [(a,1), (b,1), (c,1)], [(a,1), (b,1), (c,2)], [(a,1), (b,1), (c,3)], [(a,1), (b,2), (c,1)], [(a,1), (b,2), (c,2)], [(a,1), (b,2), (c,3)], [(a,1), (b,3), (c,1)], [(a,1), (b,3), (c,2)], [(a,1), (b,3), (c,3)], ... ]
注意,这与简单地得到叉积(笛卡尔积)有点不同。
做一些类似的事情
for i in l1: for j in l2: ...
在这里不太有效,因为例如,一旦你有了(a,1)对,你就必须跳到b,而不是继续到(a,2)。
从外观上看,似乎制定循环以获得这个结果并不太困难,但我并没有马上意识到这一点。不过,我确实用python做了一个递归解决方案,供您参考。
l1 = ['a','b','c'] l2 = [1,2,3] l3 = [] def makepair(res,cur,l1,l2): if(l1==[]): res.append(cur) else: for i in l2: temp = cur[:] temp.append((l1[0],i)) makepair(res,temp,l1[1:],l2) makepair(l3,[],l1,l2) for p in l3: print(p)
上面的代码基本上打印了我解释的示例。有人能帮我反复写这个吗?我不在乎哪种语言。