Offrire questa risposta per completezza dal numpy
è stata discussa in un'altra risposta, ed è spesso utile accoppiare i valori insieme con array di livello superiore.
Il accepted answer grandi opere per qualsiasi sequenza/matrice di rango 1. Tuttavia, se la sequenza è di più livelli (quali un numpy
matrice di rango 2 o più, ma anche ad esempio in un list
di list
s, o tuple
di tuple
s), è necessario iterare attraverso ciascuna classificazione. Di seguito riportiamo un esempio con un 2D numpy
matrice:
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)])
E lo stesso concetto funziona per qualsiasi insieme di due sequenze nidificate dimensionali della stessa forma:
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)]
Se uno o entrambi i nidificata sequenze ha "buchi" in esso, utilizzare itertools.zip_longest
per riempire i buchi (le impostazioni predefinite di valore di riempimento per None
ma possono essere specificati):
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)]
Per rendere tutto ciò completo, vorrei menzionare anche 'future_builtins'. – georg
Quindi in zip python3 è uguale a itertools.izip? O cambia a seconda delle dimensioni degli elenchi? – will
@will: Sì, 'zip' in Python3 è lo stesso di' itertools.izip' in Python2. (Non cambia il comportamento con la dimensione della lista.) Per ottenere il vecchio comportamento 'zip' in Python3, usa' lista (zip (a, b)) '. – unutbu