【问题标题】:Is there a way to yield all combinations of two arrays one by one using a generator function?有没有办法使用生成器函数一个一个地产生两个数组的所有组合?
【发布时间】:2019-08-20 12:54:03
【问题描述】:

我正在尝试使用 a 来产生两个数组的组合 generator ,但 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)

【问题讨论】:

  • 看看itertools.product

标签: python loops for-loop yield


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    每次调用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
    

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 1970-01-01
      • 2020-03-06
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多