爲完整性提供此答案,因爲numpy
已在另一個答案中進行了討論,並且將值從較高排列的數組中組合在一起通常很有用。
的accepted answer用於秩1的任何序列/陣列工作很大然而,如果序列是多個級別(例如,numpy
陣列秩2或更高的,而且如在list
的list
A S,或tuple
),需要遍歷每個等級。下面是一個2D numpy
陣列的例子:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([list('abc'), list('pdq'), list('xyz')])
c = np.array([[frobnicate(aval, bval) for aval, bval in zip(arow, brow)] for arow, brow in zip(a, b)])
而同樣的概念適用於任何一組的相同形狀的兩個維嵌套序列的工作:
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [list('abc'), list('pdq'), list('xyz')]
c = [[frobnicate(aval, bval) for aval, bval in zip(arow, brow)] for arow, brow in zip(a, b)]
如果一個或兩個嵌套的序列有「漏洞」在裏面,使用itertools.zip_longest
填寫孔(填充值默認爲None
,但可指定):
from itertools import zip_longest as zipl
a = [[], [4, 5, 6], [7, 8, 9]] # empty list in the first row
b = [list('abc'), list('pdq'), []] # empty list in the last row
c = [[frobnicate(aval, bval) for aval, bval in zipl(arow, brow)] for arow, brow in zipl(a, b)]
爲了完成這個,我還要提到'future_builtins'。 – georg
所以在python3中的zip與itertools.izip相同?還是根據列表的大小而變化? – will
@ will:是的,Python3中的'zip'與Python2中的'itertools.izip'相同。 (它不會改變列表大小的行爲。)要在Python3中獲得舊的'zip'行爲,請使用'list(zip(a,b))'。 – unutbu