Objetivo: presentar la función zip() para emparejar elementos en Python.
En la película Siete novias para siete hermanos los hermanos Pontipee se ven envueltos en la azarosa empresa de tener que encontrar pareja. Aunque lo consiguen y sea aplicable el dicho de que está bien lo que bien acaba, hay que admitir que los medios empleados son poco ortodoxos y un tanto cuestionables.
Python proporciona maneras mucho más elegantes de hacer lo mismo…
Sea hermanos una lista con los ansiosos Pontipee:
>>> hermanos = ['Adam', 'Benjamin', 'Caleb', 'Daniel',
'Efraín', 'Frank', 'Gideon']
Y sea novias la lista de pretendidas:
>>> novias = ['Milly', 'Dorcas', 'Ruth', 'Martha',
'Liza', 'Sarah', 'Alice']
Para asociar un elemento de una lista con su respectivo de otra, Python dispone de la función zip(), palabra en inglés que significa cremallera.
Visualiza por un instante una cremallera desabrochada. A ambos lados del deslizador dos filas de dientes esperan ser engarzados. Eso es precisamente lo que hace zip().
>>> zip(hermanos, novias)
<zip object at 0x02C53670>
La función zip() ha creado un objeto de tipo zip que no es otra cosa sino un iterador. Hablaremos con más profundidad sobre iteradores e iterables en otro momento, pero por ahora puedes quedarte con la idea de que pueden ser iterados, es decir, recorridos de principio a fin (con un bucle for, por ejemplo).
El objeto iterador tal cual, crudo, no puede ser visualizado directamente; para hacerlo
debemos otorgarle cierta estructura ósea. Es como si se tratara de un fantasma translúcido, incorpóreo, pero visible si volcamos un paquete de harina sobre él.
Materialicemos nuestro iterador convirtiéndolo, por ejemplo, en lista:
>>> list(zip(hermanos, novias))
[('Adam', 'Milly'), ('Benjamin', 'Dorcas'), ('Caleb', 'Ruth'),
('Daniel', 'Martha'), ('Efraín', 'Liza'), ('Frank', 'Sarah'),
('Gideon', 'Alice')]
Y ahora sí, cada oveja con su pareja.
La función zip(), hablando con más propiedad, toma iterables como argumentos (pueden ser más de dos, visualiza una cremallera tridimensional) y devuelve un iterador compuesto por tuplas, como puedes comprobar en el ejemplo anterior.
Los iterables presentes en los argumentos no tienen que ser necesariamente de la misma longitud. En ese caso, empareja los que pueda, el resto los omite:
>>> a = [0, 1, 2, 3]
>>> b = [1, 10, 100, 1000, 10000, 100000]
>>> for (exponente, resultado) in zip(a,b):
print('10 elevado a', exponente, '=', resultado)
10 elevado a 0 = 1
10 elevado a 1 = 10
10 elevado a 2 = 100
10 elevado a 3 = 1000
Presta atención a la técnica empleada para desempaquetar los elementos individuales de las tuplas generadas por zip().
THE END
Javier Montero Gabarró
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
Consulta el índice completo de artículos relacionados con Python.
Felicitaciones… con analogía no técnica es más fácil de entender
Gracias. Me alegro de que te haya gustado.
Saludos
Jajaj, que buena explicación, casi me muero de la risa con la analogía