为什么初始使用后zip没有返回任何数据?

2024-04-18 10:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码中,我需要testzip()方法。在一个例子中,我在b(zip输出)中迭代,第二次将b转换为set,但当我将b转换为set时,发生了一件奇怪的事情。在b中迭代的,打印它输出的是空列表。但是当我注释c = set(b)print(c)时,输出是正确的发生了什么,为什么?你能给我解释一下吗

    l1 = range(10)
    l2 = range(10)
    b = zip(l1,l2)
    c = set(b)
    print(c)
    result = [(x,y) for x,y in b]
    print(len(result))

Tags: 方法代码inl1列表forrangeresult
1条回答
网友
1楼 · 发布于 2024-04-18 10:19:19

zip是一个迭代器,您已经用尽了它

根据documentationzip等价于下面的生成器函数(注意yield语句):

def zip(*iterables):
    # zip('ABCD', 'xy')  > Ax By
    sentinel = object()
    iterators = [iter(it) for it in iterables]
    while iterators:
        result = []
        for it in iterators:
            elem = next(it, sentinel)
            if elem is sentinel:
                return
            result.append(elem)
        yield tuple(result)

你可以用许多方法把发电机排气。例如,对它调用listset,或应用next直到它排气

因为您已经在生成器上调用了set,所以它的内容将被清空并且不再是iterable,除非它们是通过exhating函数存储的

您可以在exhausted iterators - what to do about them?中找到一些示例和解决方案。特别是,itertools.tee可以方便地复制迭代器,以便您可以“重用”它

相关问题 更多 >