如何在Python3中获得“旧”zip()?

问题描述:

我从Python 2.7迁移到Python 3.3并且zip()无法按预期工作。 的确,我在文档中读到它现在返回一个迭代器而不是一个列表。如何在Python3中获得“旧”zip()?

那么,我应该如何处理这个?我可以在Python3代码中使用“旧”zip()吗?

查找怒吼咆哮,在Django项目之前的工作方式:

在views.py

my_zipped_list = zip(list1, list2)

在file.html

{{ my_zipped_list.0.1 }}

也许另一个解决办法是让 “新” zip()行为并改变模板。

感谢您的帮助!

+2

编写代码通常会更好,所以它不关心它是否有迭代器或列表或其他任何东西,只要它是可迭代的。有时候这是不可能的,在这种情况下,你必须将你得到的任何迭代传递给'list'函数(或者'iter',或'tuple',或者任何适合你正在做的事情的东西)。但首先,试着看看你是否真的需要。 – abarnert 2014-09-28 22:34:46

+2

将zip()从返回列表转换为返回迭代器可能会导致以前工作代码中的无提示错误。这个错误发生在代码a)创建一个zip文件时; b)迭代返回的值; c)再次迭代返回的值。当zip()返回一个列表时,(b)和(c)都会遍历压缩列表。当zip()只返回一个迭代器时,(b)迭代结果,但(c)默默无闻。我不认为2to3也能抓住这个。 – PaulMcG 2014-09-28 23:23:18

只要做一个清单list(zip(...))的结果。

+0

并且记住这个解决方案,因为当迭代器按照你的方式使用时你会经常需要它(例如,用'dict.keys()'等) – alexis 2014-09-28 22:08:37

+0

@alexis:'dict.keys()'不是迭代器,它是一个视图(与2.x中的dict.viewkeys()相同,与dict.iterkeys()不同)。 – abarnert 2014-09-28 22:33:21

+0

没错,那是我说的sl;;但是当你期望一个你不明白为什么你不能索引它的列表或者其他什么时,这一切都是一样的。 – alexis 2014-09-28 22:39:06