mar*_*eau 3 python generator enumerate
我希望能够yield使用可变数量的项目,这些项目将允许生成类似于以下内容的生成器函数:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
def multi_enumerate(*iterables):
n = 0
iterators = map(iter, iterables)
while iterators:
yield n, *tuple(map(next, iterators)) # invalid syntax
n += 1
for i,a,b,c in multi_enumerate(x, y, z):
print i,a,b,c
Run Code Online (Sandbox Code Playgroud)
有人知道某种方法吗?我知道我可以产生一个元组,但这需要在接收端明确地解压缩它,例如:a,b,c = t[0], t[1], t[2].
最终解决方案:
FWIW,这是我最终使用的,基于John Kugelman的出色答案:
from itertools import izip
def multi_enumerate(*iterables, **kwds):
start = kwds.get('start')
if start is None:
if kwds: raise TypeError(
"multi_enumerate() accepts only the keyword argument 'start'")
try:
iter(iterables[-1]) # last non-keyword arg something iterable?
except TypeError: # no, assume it's the start value
start, iterables = iterables[-1], iterables[:-1]
else:
start = 0 # default
return ((n,)+t for n, t in enumerate(izip(*iterables), start))
Run Code Online (Sandbox Code Playgroud)
添加的代码是因为我希望使它也接受一个可选的非可迭代的最后一个参数来指定一个非0的起始值(或者使用一个start关键字参数指定它),就像内置enumerate()函数一样.
将yield语句更改为:
yield (n,) + tuple(map(next, iterators))
Run Code Online (Sandbox Code Playgroud)
或者使用izip并enumerate消除整个循环:
from itertools import izip
def multi_enumerate(*iterables):
return ((n,) + t for n, t in enumerate(izip(*iterables)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |