如何从一个列表获取值对,第一个来自一个列表,第二个来自另一个列表?
我想要类似下面的代码,但希望能用更“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所说,你的代码是想从列表a
和b
中获取所有有序的元素对。在这种情况下,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
这些其实不是组合,严格来说,它们是来自于两个集合 a
和 b
的笛卡尔积。要生成这些成对的元素,可以使用标准库中的一个函数,叫做 itertools.product()
:
for i, j in itertools.product(a, b):
# Whatever