接受迭代和 returns 字符串的函数

function that takes iterables and returns a string

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

备用生成器将任意数量的可迭代对象作为参数:它从第一个参数生成第一个值,然后从第二个参数生成第一个值,...,然后从最后一个参数生成第一个值;然后是第一个参数的第二个值,然后是第二个参数的第二个值,...,然后是最后一个参数的第二个值;等等。如果任何可迭代对象不再产生任何值,则此生成器将不再产生任何值。例如:

for i in alternate('abcde','fg','hijk'):
    print(i,end='')

答案是:

afhbgic

当我的函数需要

('abcde','fg','hijk')

它returns

afh

但正确答案是

afhbgic

有人可以告诉我如何解决吗?非常感谢!

这样的解决方案怎么样:

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

如果你必须有发电机,你可以使用itertools.zip_longestizip_longest如果使用Python2.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'
>>> 

我就是喜欢这样的疯狂,抱歉:)

alternate = lambda args: ''.join(
    filter(
        lambda _, p={1:1}: _ if _ and p else p.clear(),
        reduce(
            lambda x,y: x+y,
            map(None, *args)
        )
    )
)