這裡介紹如何在 Python 中同時對多個 list 進行迭代,在迴圈中每次各取一個 list 中的元素進行處理。

zipfor 迴圈

在 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) 會將 namesvalues 的每個元素以一對一的方式配對起來,組成一個新的迭代器,然後交給 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)

參考資料:StackOverflowpython3-cookbook