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

时间:2013-12-18 12:49:22

标签: python iterator tuples

我有一个功能:

def func(i, k):
  j = 0
  while True:
    yield j * i + k
    j += 1

以及一些ik个实例:

pars = [(2, 4), (1, 5), (7, 2)]

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

for func_tups in zip(func(2, 4), func(1, 5), func(7, 2)):
   print func_tups

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

2 个答案:

答案 0 :(得分:7)

for func_tup in zip(*(func(*p) for p in pairs)):
    print func_tup

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

iterators = (func(*pair) for pair in pairs)  # aka starmap
for func_tup in zip(*iterators):
    print func_tup

答案 1 :(得分:7)

您正在寻找itertools.starmap()

from itertools import starmap

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

此处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