1. 程式人生 > >【python學習筆記】for迴圈遍歷兩個列表失敗—— ValueError: too many values to unpack

【python學習筆記】for迴圈遍歷兩個列表失敗—— ValueError: too many values to unpack

for迴圈遍歷兩個列表失敗—— ValueError: too many values to unpack

問題來源:

我現在有兩個列表,一個是標題,一個是訪問量,我想在一個for迴圈中,獲取這兩個列表中同一位置的值,然後打印出來,記得好像之前看過Python的for可以迭代兩個列表,所以我就寫了下面的程式碼:

# 兩個列表大概的內容是——
# self.view_list = ["12","15"]
# self.title_list = ["我是標題a","我就是標題b"]
for v,t in self.view_list,self.title_list:
     print "----------***----------\n題目: 《%s》\n瀏覽量: %s"
%(t,v)

然後報錯為:
ValueError: too many values to unpack

咋回事兒?

我做了什麼?直接搜這個報錯,好像並沒有什麼有價值的資訊,我搜了一下
for迴圈遍歷兩個列表
so,找到了下面的例子:
參考連結:
python的for迴圈同時遍歷兩個list?

為啥會報錯?

資料中給了一個參考示例:
對於

for i, j in b, c:

當你寫出 b, c 的時候, Python 會以為你要製造一個 tuple, 所以:

for i, j in b, c:

相當於:

for i, j in (b, c):

當 b = [1, 2, 3] 且 c = [(10, 20), (30, 40), (50, 60)] 時就相當於:

for i, j in ([1, 2, 3], [(10, 20), (30, 40), (50, 60)]):

所以第一個迭代到的物件是 [1, 2, 3], 而這個 list 有三個元素自然是無法拆解成兩個變數 i 和 j 的。

但如果 b = [1, 2] 且 c = [(10, 20), (30, 40)],則相當於:

for i, j in ([1, 2], [(10, 20), (30, 40)]):

第一個迭代到的物件是 [1, 2], 該 list 有兩個元素恰能 unpack 為 i 和 j,所以下面的語法是能夠順利執行的。

>>> b = [1, 2]
>>> c = [(10
, 20), (30, 40)] >>> for i,j in b,c: ... print i ... print j ... 1 2 (10, 20) (30, 40)

也就是說能順利迭代,是恰巧,而且並不一定能合理的取出你想要的順序!

我們到底該如何處理兩個列表的for迴圈呢?

回到你的需求,若要平行迭代兩個 list,你需要的是 zip 或 zip_longest
好,我就來試試zip函式:

>>> b = [1,2]
>>> c = [(10,20),(30,40)]
>>> for i,j in zip(b,c):
...     print i
...     print j
... 
1
(10, 20)
2
(30, 40)

可以看出>>> b = [1,2]
>>> c = [(10,20),(30,40)]
>>> for i,j in zip(b,c):
...     print i
...     print j
... 
1
(10, 20)
2
(30, 40)

可以看出來,這個才算是一個一個的按每個列表的順序,依次取出~
OK,基本上就這樣了