別の回答で説明されているため、完全を期すためにこの回答を提供しnumpy
ます。上位の配列の値をペアにすることが役立つことがよくあります。
受け入れられた答えは、ランク1の任意のシーケンス/配列でうまく機能します。ただし、シーケンスが複数のレベル(numpy
ランク2以上の配列などlist
、list
またはsまたはsの配列など)の場合tuple
、tuple
必要です各ランクを反復します。以下は、2Dnumpy
配列の例です。
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)])
同じ概念は、同じ形状の 2 次元のネストされたシーケンスの任意のセットに対しても機能します。
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)]
ネストされたシーケンスの 1 つまたは両方に「穴」がある場合は、 を使用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)]