【发布时间】:2023-02-08 20:23:20
【问题描述】:
所以我脑子里有这个问题,我试图迭代而不是递归地解决这个问题,但这个解决方案似乎让我望而却步,尽管它看起来很容易。
假设我有两个列表
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)
上面的代码基本上打印了我解释的例子。有人可以帮我迭代地写这个吗?我不在乎是哪种语言。
【问题讨论】:
-
我们能做我们想做的事吗实际上这样做,例如,
itertools? -
@KellyBundy 你会谈论做这样的事情吗
product(l2, repeat=l1.size())? -
@itsmarziparzi
len(l1),不是l1.size() -
涉及到这一点,是的(但使用
len)。
标签: list algorithm permutation cartesian-product