這裡介紹如何在 Python 中同時對多個 list 進行迭代,在迴圈中每次各取一個 list 中的元素進行處理。
zip 與 for 迴圈
在 Python 中若要將兩個 list 以迴圈的方式一次各取一個元素出來處理,可以使用 zip 打包之後配合 for 迴圈來處理:
# 第一個 List names = ["A", "B", "C"] # 第二個 List values = [11, 23, 46] # 使用 zip 同時迭代兩個 List for x, y in zip(names, values): print(x, y)
這裡的 zip(names, values) 會將 names 與 values 的每個元素以一對一的方式配對起來,組成一個新的迭代器,然後交給 for 迴圈進行迭代,所以每一次迭代時所取的 x 值會來自於 names,而 y 則會來自於 values,結果就會像這樣:
A 11 B 23 C 46
不同長度的 Lists
zip 若遇到不同長度的 list 時,會以長度最短的 list 為準,超過長度的部分就會被捨棄:
# 兩個不同長度的 List names2 = ["A", "B", "C"] values2 = [11, 23] for x, y in zip(names2, values2): print(x, y)
A 11 B 23
若要以長度最長的 list 為準,可以改用 zip_longest,而長度不足的 list 則會以 None 補足:
# 以長度最長的 List 為準 from itertools import zip_longest for x,y in zip_longest(names2, values2): print(x, y)
A 11 B 23 C None
同時迭代多個 Lists
這種方式同樣適用於多個 lists 的狀況:
# 多個 Lists names = ["A", "B", "C"] values = [11, 23, 46] ages = [45, 67, 82] # 使用 zip 同時迭代多個 List for x, y, z in zip(names, values, ages): print(x, y, z)
A 11 45 B 23 67 C 46 82
建立 Dict
假設我們有兩個 lists 分別存放鍵與值的資料:
# 鍵與值的資料 keys = ["tw", "us", "it"] values = [2.1, 3.8, 6.9]
若要用這兩個 lists 建立一個 dict,可以這樣寫:
# 建立 Dict
dict(zip(keys, values))
{'us': 3.8, 'it': 6.9, 'tw': 2.1}
補充說明
zip 的傳回值在 Python 2 與 Python 3 中會有一些差異:
names = ["A", "B", "C"] values = [11, 23, 46] zip(names, values)
若在 Python 2 中,zip 會傳回 tuples 組成的 list:
[('A', 11), ('B', 23), ('C', 46)]
若是在 Python 3 中,則會傳回一個 tuples 的迭代器(iterator):
<zip object at 0x7f9fc4024b08>
若在 Python 3 中也想要產生一個由 tuples 組成的 list(就像 Python 2 一樣),可以使用:
list(zip(names, values))
Unzip
若要將 zip 打包過後的 list 轉回原來的兩個 lists,可以使用 zip(*zippedList) 這種寫法:
# 打包成 Tuples 組成的 List zippedList = list(zip(names, values)) # 轉回原來的兩個 Lists n, v = zip(*zippedList)
Python 2 使用迭代器
Python 3 使用迭代器的好處就是可以更有效率的處理大量的資料,而若在 Python 2 中也想使用迭代器的話,可以改用這種方式:
import itertools # Python 2 使用迭代器 for x, y in itertools.izip(names, values): print(x, y) # 以最長的 list 為準 for x, y in itertools.izip_longest(names, values): print(x, y)
參考資料:StackOverflow、python3-cookbook