def alternate(*args):
l = ''
c = 0
while True:
try:
iterable = args[c]
i = iter(iterable)
l = l + next(i)
c = c + 1
except:
break
yield l
备用生成器将任意数量的iterables作为参数:它从第一个参数生成第一个值,然后从第二个参数生成第一个值,...,然后从最后一个参数生成第一个值;然后是第一个参数的第二个值,然后是第二个参数的第二个值,...,然后是最后一个参数的第二个值;如果任何iterable不再生成值,则此生成器不再生成值。例如:
for i in alternate('abcde','fg','hijk'):
print(i,end='')
答案是:
afhbgic
当我的功能
时('abcde','fg','hijk')
它返回
afh
但正确答案是
afhbgic
有人能告诉我如何解决它吗?非常感谢!
答案 0 :(得分:1)
如果你必须有一个生成器,你可以使用itertools.zip_longest
(izip_longest
如果使用Python 2.x):
from itertools import zip_longest
def alternate(*args):
for tup in zip_longest(*args):
for el in tup:
if el:
yield el
else:
return
<强>输出:强>
>>> ''.join(alternate('abcde','fg','hijk'))
'afhbgic'
>>>
否则,只需使用普通功能:
from itertools import zip_longest
def alternate(*args):
s = ''
for tup in zip_longest(*args):
for el in tup:
if el:
s += el
else:
return s
<强>输出:强>
>>> alternate('abcde','fg','hijk')
'afhbgic'
>>>
答案 1 :(得分:0)
这样的解决方案怎么样:
def alternate(*args):
l = ''
# initialize iterators for each argument
iterators = [iter(it) for it in args]
# iterate over lengths, using iterators
while True:
for it in iterators:
try:
l = l + next(it)
except StopIteration:
return l
return l
result = alternate('abcde','fg','hijk')
print(result) # afhbgic
答案 2 :(得分:0)
我只是喜欢这样的疯狂,抱歉:)
alternate = lambda args: ''.join(
filter(
lambda _, p={1:1}: _ if _ and p else p.clear(),
reduce(
lambda x,y: x+y,
map(None, *args)
)
)
)