2014-09-28 32 views
6

我從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

回答

7

只要做一個清單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

相關問題