代码之家  ›  专栏  ›  技术社区  ›  arash moradi

为什么zip在初次使用后不返回任何项目?[副本]

  •  0
  • arash moradi  · 技术社区  · 7 年前

    在下面的代码中,我想要测试 zip() 方法在一个示例中,我在b(zip输出)中迭代,第二个示例将b转换为集合。但当我把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))
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Community CDub    5 年前

    zip 是一个已耗尽的迭代器。

    根据 documentation , 拉链 等效于下面的发电机功能(请注意 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)
    

    发电机的排气方式有很多种。例如,通过调用 list set 或通过应用 next 直到它耗尽。

    自从你打电话以来 设置 在发电机上,其内容物被清空,不再适用,除非通过排气功能存储。

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