zip生成器从元组列表传递参数

per*_*eal 3 python iterator tuples

我有一个功能:

def func(i, k):
  j = 0
  while True:
    yield j * i + k
    j += 1
Run Code Online (Sandbox Code Playgroud)

还有一些ik实例:

pars = [(2, 4), (1, 5), (7, 2)]
Run Code Online (Sandbox Code Playgroud)

如何在不知道pars的长度的情况下压缩pars的func?像这样:

for func_tups in zip(func(2, 4), func(1, 5), func(7, 2)):
   print func_tups
Run Code Online (Sandbox Code Playgroud)

我想象地图,拉链,lambda,?的一些组合*

Eri*_*ric 7

for func_tup in zip(*(func(*p) for p in pairs)):
    print func_tup
Run Code Online (Sandbox Code Playgroud)

虽然这可能更好地描述为两行:

iterators = (func(*pair) for pair in pairs)  # aka starmap
for func_tup in zip(*iterators):
    print func_tup
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 7

您正在寻找itertools.starmap():

from itertools import starmap

for func_tups in zip(*starmap(func, pairs)):
    # warning, infinite loop unless you have a break condition
Run Code Online (Sandbox Code Playgroud)

这里starmap()应用任意长度pairs作为参数func,然后您可以将其zip()作为单独的参数传递给它们.你不能map()在这里使用,因为它只支持带有一个参数的callables .

这假设你使用的是Python 3 zip(); 在Python 2上,您显然需要使用itertools.izip()处理由func()生成器生成的无限序列的元组作为可迭代:

from itertools import starmap, izip

for func_tups in izip(*starmap(func, pairs)):
    # warning, infinite loop unless you have a break condition
Run Code Online (Sandbox Code Playgroud)