如何从一个列表获取值对,第一个来自一个列表,第二个来自另一个列表?

46 投票
7 回答
92633 浏览
提问于 2025-04-16 20:24

我想要类似下面的代码,但希望能用更“Pythonic”的风格,或者使用标准库来实现:

def combinations(a,b):
    for i in a:
        for j in b:
             yield(i,j)

7 个回答

8

嵌套的生成器表达式也可以使用:

product = ((i, j) for i in a for j in b)
for i, j in product:
    # ...
52

正如Sven所说,你的代码是想从列表ab中获取所有有序的元素对。在这种情况下,itertools.product(a,b)就是你需要的。

如果你实际上想要的是“组合”,也就是从列表a中获取所有不分顺序的不同元素对,那么你应该使用itertools.combinations(a,2)

>>> for pair in itertools.combinations([1,2,3,4],2):
...    print pair
...
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
54

这些其实不是组合,严格来说,它们是来自于两个集合 ab 的笛卡尔积。要生成这些成对的元素,可以使用标准库中的一个函数,叫做 itertools.product()

for i, j in itertools.product(a, b):
    # Whatever

撰写回答