Proponowanie tej odpowiedzi pod kątem kompletności od numpy
zostało omówione w innej odpowiedzi, a często przydatne jest parowanie wartości z tablic o wyższej pozycji.
accepted answer doskonale do dowolnej sekwencji/tablicy stopnia 1. Jednakże, jeśli sekwencja wielu poziomach (takich jak numpy
tablicy 2 stopień lub więcej, ale także, tak jak w list
z list
S albo tuple
z tuple
s), należy iterować przez każdą pozycję. Poniżej znajduje się przykład z 2D numpy
tablicy:
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 sama koncepcja będzie pracować dla dowolnego zbioru dwuwymiarowych zagnieżdżonych sekwencji o tym samym kształcie:
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)]
Jeśli jeden lub oba z zagnieżdżonych sekwencje ma „dziury” w nim, używają itertools.zip_longest
wypełnić otwory (domyślne wartości napełnienia do None
ale może być określona):
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)]
Aby to zrobić, wspomniałbym również o 'future_builtins'. – georg
Więc w zip w python3 jest taki sam jak itertools.izip? A może zmienia się w zależności od wielkości list? – will
@will: Tak, 'zip' w Python3 jest taki sam jak' itertools.izip' w Python2. (Nie zmienia to zachowania z rozmiarem listy.) Aby uzyskać stare zachowanie 'zip' w Python3, użyj' list (zip (a, b)). – unutbu