這裡介紹如何在 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
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 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
假設我們有兩個 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))
若要將 zip
打包過後的 list 轉回原來的兩個 lists,可以使用 zip(*zippedList)
這種寫法:
# 打包成 Tuples 組成的 List zippedList = list(zip(names, values)) # 轉回原來的兩個 Lists n, v = zip(*zippedList)
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)