【问题标题】:How would I get a list of pairs where every element from list1 is paired with some element from list2?我如何获得一个对列表,其中 list1 中的每个元素都与 list2 中的某个元素配对?
【发布时间】: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


【解决方案1】:

请注意,这与简单地获得叉积(笛卡尔积)有点不同。

实际上,它恰好是list2list2list2的笛卡尔积,使用list1作为索引。

请注意,叉积和笛卡尔积是完全不相关的。在 python 中,您可以使用 itertools.product 通过标准库获取笛卡尔积。对于叉积,使用numpy library

from itertools import product

list1 = ['a','b','c']
list2 = [1,2,3]

print( [list(zip(list1, p)) for p in product(list2, repeat=len(l1))] )
# [[('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', 3), ('b', 3), ('c', 3)]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2020-03-27
    • 2018-12-10
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多