【问题标题】:The zip() function in Python 3 [duplicate]Python 3 中的 zip() 函数 [重复]
【发布时间】:2015-10-19 11:03:19
【问题描述】:

我知道如何在 Python 3 中使用 zip() 函数。我的问题是关于以下我觉得很奇怪的问题:

我定义了两个列表:

lis1 = [0, 1, 2, 3]
lis2 = [4, 5, 6, 7]

我通过以下方式在这些上使用zip()

1. test1 = zip( lis1, lis2)

2. test2 = list(zip(lis1, lis2))

当我在解释器中输入 test1 时,我得到了:

"zip object at 0x1007a06c8"

所以,我在解释器中输入 list(test1) 并得到预期的结果,但是当我再次输入 list(test1) 时,我得到一个空列表。

我觉得奇怪的是,无论我在解释器上输入多少次test2,我总是得到预期的结果,而不是一个空列表。

【问题讨论】:

  • zip() 是一个生成器;它只产生一次值。 list() 创建一个包含任何可迭代对象(包括生成器)的列表,因此您只需提取一次 zip() 的值并将结果列表存储在 lis2 中。列表对象不是生成器,它们会跟踪包含的所有值。
  • 在 Python 3 中稍微短一点:test2 = [*zip(lis1, lis2)].
  • test2 = *zip(lis1, lis2), 将 zip-iterator 解压成一个元组(Python 3)。

标签: python


【解决方案1】:

Python 3 中的zip() 函数返回一个迭代器。这就是为什么当您打印 test1 时会得到 - <zip object at 0x1007a06c8> 的原因。 From documentation-

创建一个迭代器,聚合来自每个可迭代对象的元素。

但是一旦你这样做了 - list(test1) - 你已经用尽了迭代器。所以在那之后任何时候你做list(test1)只会导致空列表。

如果是test2,您已经创建了一次列表,test2 是一个列表,因此它将始终是那个列表。

【讨论】:

  • 这种行为不适用于生成器,而不是迭代器?
  • 为什么它不适用于迭代器?检查 - stackoverflow.com/questions/2776829/… - 每个生成器都是一个迭代器。迭代器也可能会耗尽,同样地,可能会有永远不会耗尽的生成器。
【解决方案2】:

与 Python 2 不同,Python 3 中的zip 函数返回一个迭代器。迭代器只能用尽一次(通过像制作一个列表这样的方法)。这样做的目的是通过仅根据需要生成迭代器的元素来节省内存,而不是一次将它们全部放入内存中。如果您想重用您的压缩对象,只需像在第二个示例中那样创建一个列表,然后通过类似的方式复制该列表

 test2 = list(zip(lis1,lis2))
 zipped_list = test2[:]
 zipped_list_2 = list(test2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2016-03-18
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2017-07-06
    • 2018-11-01
    相关资源
    最近更新 更多