有没有办法使用生成器函数逐个产生两个数组的所有组合?

问题描述 投票:0回答:2

我试图使用生成器产生两个数组的组合,但i,j值保持不变。

array1 = [1,2,3,4]
array2 = [4,5]

def testyield():

    global array1
    global array2

    for i in range (0,len(array1)):
        for j in range (0,len(array2)):
            yield array1[i],array2[j]


print next(testyield())
print next(testyield())
print next(testyield())
print next(testyield())

我期望(1,4)(1,5)(2,4)(2,5)的产出,但实际产出是(1,4)(1,4)(1,4)(1,4) )

python loops for-loop yield
2个回答
1
投票

每次调用testyield()时,您都在创建一个新的生成器

您必须做的是将其分配给变量,然后在您的生成器上调用next

my_gen = testyield()
print next(my_gen) # (1, 4)
print next(my_gen) # (1, 5)
print next(my_gen) # (2, 4)
print next(my_gen) # (2, 5)

正如其他人所说,如果您的目标是制作优秀的代码,请查看itertools.product,它直接回答您的问题:

from itertools import product
for e in product(array1, array2):
    print e

0
投票

itertools.product()可能就是你想要的。它返回一个生成器:

import itertools
array1 = [1,2,3,4]
array2 = [4,5]

for x in itertools.product(array1, array2):
    print(x)
# (1, 4)
# (1, 5)
# (2, 4)
# (2, 5)
# (3, 4)
# (3, 5)
# (4, 4)
# (4, 5)

但要使代码工作,请使用以下方式:

for x in testyield():
    print(x)
© www.soinside.com 2019 - 2024. All rights reserved.