Python迭代器和zip

时间:2016-06-25 03:08:08

标签: python iterator zip

使用es6-shim.min.js:1 Uncaught SyntaxError: Unexpected token < zone.js:1 Uncaught SyntaxError: Unexpected token < Reflect.js:1 Uncaught SyntaxError: Unexpected token < system.src.js:1 Uncaught SyntaxError: Unexpected token < systemjs.config.js:1 Uncaught SyntaxError: Unexpected token < rahul:20 Uncaught ReferenceError: System is not defined(anonymous function) @ rahul:20 bundle.min.js:1 Uncaught SyntaxError: Unexpected token < ,我可以从x = [1,2,3,4]获得一个迭代器。

使用这个迭代器,我可以使用zip函数创建一个包含两个项目的元组。

i = iter(x)

即使我可以使用此语法来获得相同的结果。

>>> i = iter(x)
>>> zip(i,i)
[(1, 2), (3, 4)]

这是如何工作的? >>> zip(*[i] * 2) [(1, 2), (3, 4)] zip(i,i)的迭代器如何工作?

2 个答案:

答案 0 :(得分:9)

迭代器就像一个项目流。您只能一次查看流中的项目,并且只能访问第一个元素。要查看流中的某些内容,您需要将其从流中删除,一旦您从流的顶部获取内容,它就会从流中消失。

当您致电zip(i, i)时,zip首先查看第一个流并取出一个项目。然后它查看第二个流(恰好是与第一个流相同的流)并取出一个项目。然后它从这两个项目中生成一个元组,并反复重复这个元素直到流中没有任何内容。

也许更容易看出我是否在纯python中编写zip函数(为简单起见,只有2个参数)。它看起来像 1

def zip(a, b):
    out = []
    try:
        while True:
            item1 = next(a)
            item2 = next(b)
            out.append((item1, item2))
    except StopIteration:
        return out

现在假设你在谈论ab 是同一个对象的情况。在这种情况下,我们只需在迭代器(在您的示例中为next)上调用i两次,它将按顺序从i中取出前两项并将它们打包成元组。

一旦我们理解了zip(i, i)行为方式的原因,zip(*([i] * 2))并不太难。让我们从里到外读出表达式......

[i] * 2

这只是创建一个新的列表(长度为2),其中两个元素都是对迭代器i的引用。所以它与zip(*[i, i])是一样的(当你想要重复两次以上的事情时,写起来会更方便)。 *解压缩是python中常见的习惯用法,您可以在the python tutorial中找到更多信息。它的要点是python接受iterable并“解包”它,好像每个iterable项都是函数的一个单独的位置参数。所以:

zip(*[i, i])

做同样的事情:

zip(i, i)

现在鲍勃是我们的叔叔。我们刚开始全圈,因为zip(i, i)是讨论开始的地方。

1 这个示例代码绝对不仅仅是前面提到的只接受2个参数。例如,zip可能会在输入参数上调用iter,这样它就可以用于任何可迭代的(不仅仅是迭代器),但这应该足以得到点...

答案 1 :(得分:0)

每次从迭代器中获取一个项目时,它都会停留在该位置,而不是“#34;倒带”。&#34;因此zip(i, i)获取i中的第一项,然后获取i中的第二项,并将其作为tuple返回。它继续为每个可用对执行此操作,直到迭代器耗尽。

zip(*[i]*2)通过将list乘以[i, i]来创建i 2,然后将其与最左边的*解包,实际上,它将ii两个参数发送到zip,产生与第一个代码段相同的结果。