可以接受生成器的函数,创建元组列表

时间:2018-06-11 15:39:37

标签: python python-3.x generator

我有一个函数可以接受一个数字列表,一个数字元组,或一串数字和一个变量n,它会在传递的迭代中迭代时创建一个长度为n的元组列表。

此时它按预期工作:

numbers = [1, 2, 3, 4, 5, 6]
# numbers = (1, 2, 3, 4, 5, 6)
# numbers = '123456'


def window(iterable, n):
    if n == 0:
        return []
    final = []
    last = len(iterable) - (n - 1)
    for start in range(0, last):
        tup = tuple(numbers[start:start + n])
        final.append(tup)
        start += 1
    return final


print(window(numbers, 2))
print()
print(window(numbers, 3))
print()
print(window(numbers, 4))

列表和字符串的示例输出:

[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]
[('1', '2'), ('2', '3'), ('3', '4'), ('4', '5'), ('5', '6')]
[('1', '2', '3'), ('2', '3', '4'), ('3', '4', '5'), ('4', '5', '6')]
[('1', '2', '3', '4'), ('2', '3', '4', '5'), ('3', '4', '5', '6')]

现在我需要允许函数接受生成器,但仍然生成相同的样式输出。

前:

numbers = [1, 2, 3, 4, 5, 6]
squares = (n**2 for n in numbers)
window(squares, 3)
[(1, 4, 9), (4, 9, 16), (9, 16, 25), (16, 25, 36)]

如果按原样运行,我得到:

TypeError: object of type 'generator' has no len()

我理解为什么。我的问题是,我所能想到的只是“倾销'生成器输出到一个列表然后通过该函数运行它,这是蹩脚的。允许将生成器作为有效输入,然后将其耗尽到列表中是没有意义的。

我想出了如何识别是否传入了一个生成器:

import types


def window(iterable, n):
    if n == 0:
        return []
    final = []
    if isinstance(iterable, types.GeneratorType):
        print('Gen')
    else:
        last = len(iterable) - (n - 1)
        for start in range(0, last):
            tup = tuple(numbers[start:start + n])
            final.append(tup)
            start += 1
        return final

但是,当传入生成器时,我仍然不知道如何继续生成所需的输出。

0 个答案:

没有答案