【问题标题】:list() applied to zip object twice in a row issuelist() 连续两次应用于 zip 对象问题
【发布时间】:2020-02-27 15:19:20
【问题描述】:

我已经构建了一个 zip 对象,我偶然注意到如果我两次将 list() 应用于该对象,第二次它将产生 []。我的代码如下所示:

coordinate = ['x', 'y', 'z']
values = [5, 7, 9]

my_map = zip(coordinate, values)

my_map_list_first = list(my_map)
my_map_list_second = list(my_map)

print(my_map_list_first)
print(my_map_list_second)

代码的输出是:

[('x', 5), ('y', 7), ('z', 9)]
[]

我是 Python 新手,所以我的术语可能不是 100% 准确。我试过在网上找到解释,但这里的问题是实际问题是什么。 (好问题使他回答了一半)。由于我还在学习 Python,我可能不知道该问什么。

我还尝试使用我在另一个主题中看到的那个 Python 模拟器: http://www.pythontutor.com/visualize.html#mode=display 但我只看到了我所知道的 - my_map_list_second 是 [],而不是引擎盖下到底发生了什么。 有人可以解释这里发生了什么吗?并且在“类似”问题上为我指明了正确的方向,尽管我相信随着我在 Python 上的进步,这些会随着时间的推移变得清晰。

这也是我在这些论坛上的第一个端口。提前致谢。

【问题讨论】:

    标签: python python-3.x list zip


    【解决方案1】:

    zip 返回 generator,而不是 listgenerator 只运行一次,因此您需要再次调用 zip 以获得 my_map_list_second

    【讨论】:

    • 感谢您的回复。我知道 zip 不会返回列表,但我不知道生成器。我现在将去阅读有关它们的信息。
    【解决方案2】:

    您正在寻找关于generator 的遮阳篷。

    事实上,zip 将创建一个 generator,直到您 iterate 处理它才进行处理,在您的示例中使用 list。另一个重要的属性是generator 只能是iterate once

    最后一个属性解释了为什么你第二次得到一个空列表。

    【讨论】:

    • 感谢您的回复。我显然不了解现阶段的生成器,并且您只能通过它迭代一次的信息很有用,我会记住的。我知道 zip() 创建了一个 zip 对象(它是可迭代的),但我不知道它还创建了什么生成器。我现在会去阅读更多内容。
    • 不客气,只是从观点来看,所有生成器都是可迭代的,但不可迭代的是生成器。但你有它,祝你学习之旅好运。
    • 术语 nitpick:zip 对象不是生成器,但它们是迭代器。
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多