14

使用 zip() 函数时,我看到一个奇怪的行为。当我执行以下操作 len(list(z)) 其中 z 是一个 zip 对象时,结果为 0(这对我来说似乎是错误的),并且该操作似乎清除了 zip 对象。有人可以帮我了解发生了什么。

# python3
Python 3.2.3 (default, Sep 30 2012, 16:41:36) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> w = [11, 22, 33, 44, 55, 66]
>>> x = [1, 2, 3, 4]
>>> y = ['a', 'b', 'c']
>>> z = zip(x, y, w)
>>> z
<zip object at 0x7f854f613cb0>
>>> list(z)
[(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)]
>>> len(list(z))
0
>>> list(z)
[]
>>> z
<zip object at 0x7f854f613cb0>
>>> 

谢谢你,艾哈迈德。

4

2 回答 2

16

在 Python 3中,zip 是一个生成器。当你这样做时,发电机正在耗尽list(z)。您可以从生成器返回的值创建一个列表并对其进行操作。

l = list(z)
len(l)
# -> 3
l
# -> [(1, 'a', 11), (2, 'b', 22), (3, 'c', 33)]

发电机是个好东西。它们允许我们以几乎与编写处理列表的代码相同的方式编写内存高效代码。要使用链接 wiki 中的示例:

def double(L):
    return [x*2 for x in L]

可以重写为生成器以避免在内存中创建另一个列表:

def double(L):
    for x in L:
        yield x*2
于 2013-01-31T23:45:32.570 回答
3

为了完成前面的答案,有一个 Python 库调用cardinality来获取可迭代对象的大小。

http://cardinality.readthedocs.io/en/latest/

于 2016-10-31T16:35:08.403 回答