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)
还有一些i和k实例:
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,?的一些组合*?
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)
您正在寻找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)
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |