获取iterables并返回一个字符串的函数

时间:2016-10-28 04:22:43

标签: python iterable

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

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

3 个答案:

答案 0 :(得分:1)

如果你必须有一个生成器,你可以使用itertools.zip_longestizip_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)
        )
    )
)