【问题标题】:How can I get the "old" zip() in Python3?如何在 Python3 中获取“旧”zip()?
【发布时间】:2014-09-28 22:02:56
【问题描述】:

我从 Python 2.7 迁移到 Python 3.3 并且 zip() 不再按预期工作。 事实上,我在文档中读到它现在返回一个迭代器而不是一个列表。

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

查看它之前在 Django 项目中的工作方式:

在views.py中:my_zipped_list = zip(list1, list2)

在file.html中:{{ my_zipped_list.0.1 }}

也许另一种解决方案是保留“新” zip() 行为并改为更改模板。

感谢您的帮助!

【问题讨论】:

  • 通常最好写你的代码,这样它就不管它是否有一个迭代器或一个列表或其他任何东西,只要它是可迭代的。有时这是不可能的,在这种情况下,您必须将获得的任何可迭代对象传递给list 函数(或iter,或tuple,或任何适合您尝试做的事情)。但首先,试着看看你是否真的需要。
  • zip() 从返回列表到返回迭代器的转换可能会导致以前工作代码中出现静默错误。该错误发生在代码 a) 创建 zip 时; b) 迭代返回的值; c) 再次迭代返回的值。当 zip() 返回一个列表时,(b) 和 (c) 都将遍历压缩列表。当 zip() 只返回一个迭代器时,(b) 迭代结果,但 (c) 默默地什么也不做。我认为 2to3 也没有抓住这一点。

标签: python django python-3.x


【解决方案1】:

只需通过list(zip(...)) 列出结果。

【讨论】:

  • 请记住这个解决方案,因为当迭代器妨碍您时,您会经常需要它(例如,dict.keys() 等)
  • @alexis: dict.keys() 不是迭代器,它是一个视图(与 2.x 中的 dict.viewkeys() 相同,与 dict.iterkeys() 不同)。
  • 对,我这么说太草率了;但是当你期望一个列表你不明白为什么你不能索引它时,一切都是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多