Python Quiz 13 – Combinar elementos en tuplas con ZIP

ZIP en python combinar listas

Pregunta principal del PyQuiz:

>>> pos = [3, 1, 2, 4]
>>> names = ['Juan', 'Pedro', 'María']
>>> for position, name in zip(pos, names):
...     print(f'{name} -> {position}')
- ?? -
A = 'Juan -> 3\nPedro -> 1\nMaría -> 2'
B = RuntimeError
C = 'Juan -> 3\nPedro -> 1\nMaría -> 2\nNone -> 4'

Concepto y explicación

En este PyQuiz se puede ver cómo usar zip para manipular secuencias de datos de forma elegante y sencilla.

Para entender este ejemplo solo hay que ver el concepto como una cremallera en la que hay dos partes y van uniendose uno a uno todos los elementos.

Unión de listas usando ZIP en Python

El método en sí de zip es una función constructora que se encuentra en el build-in (al igual que int, float, o str) y que crea un iterador, por tanto crea «cómo se unen las listas» pero no «las listas unidas»

>>> zip
<class 'zip'>
>>> print(zip.__doc__)
zip(*iterables) --> A zip object yielding tuples until an input is exhausted.

   >>> list(zip('abcdefg', range(3), range(4)))
   [('a', 0, 0), ('b', 1, 1), ('c', 2, 2)]

The zip object yields n-length tuples, where n is the number of iterables
passed as positional arguments to zip().  The i-th element in every tuple
comes from the i-th iterable argument to zip().  This continues until the
shortest argument is exhausted.
>>> z = zip([4, 5, 6], ['Juan', 'Ana', 'Pepa'])
>>> z
<zip object at 0x7fa670c3d800>
>>> list(z)
[(4, 'Juan'), (5, 'Ana'), (6, 'Pepa')]

Por lo que se pueden utilizar para unir grandísimas listas sin ocupar practicamente nada en memoria:

>>> import sys
>>> nums = [x for x in range(1_000_000)]
>>> letters = ['a' * s for s in range(10_000)]

>>> sys.getsizeof(nums)
8697456
>>> sys.getsizeof(letters)
87616
>>> zip_nums_letters = zip(nums, letters)
>>> sys.getsizeof(zip_nums_letters)
56

Pero el número de elementos que se muestran al unir ambas listas el siempre igual al número de elementos de la menor secuencia, en este caso serían solo 10.000 elementos dado que letters solo tiene 10.000 elementos

>>> ret = list(zip_nums_letters)
>>> len(ret)
10000
>>> ret[:10]
[(0, ''), (1, 'a'), (2, 'aa'), (3, 'aaa'), (4, 'aaaa'), (5, 'aaaaa'), (6, 'aaaaaa'), (7, 'aaaaaaa'), (8, 'aaaaaaaa'), (9, 'aaaaaaaaa')]

Por tanto en nuestra pregunta inicial se puede deducir que sólo se mostrarán los elementos unidos entre las listas hasta ('María', 2)

Cabe destacar que los elementos usados para zip pueden ser de cualquier tipo y se pueden mezclar iteradores de cualquier tipo o incluso iteradores de iteradores:

>>> paragraph = 'En un lugar de la mancha'
>>> nums = range(2000)
>>> list(zip(nums, paragraph))
[(0, 'E'), (1, 'n'), (2, ' '), (3, 'u'), (4, 'n'), (5, ' '), (6, 'l'), (7, 'u'), (8, 'g'), (9, 'a'), (10, 'r'), (11, ' '), (12, 'd'), (13, 'e'), (14, ' '), (15, 'l'), (16, 'a'), (17, ' '), (18, 'm'), (19, 'a'), (20, 'n'), (21, 'c'), (22, 'h'), (23, 'a')]

>>> para2 = 'El perro de sanroque'
>>> list(zip(para2, paragraph))
[('E', 'E'), 
('l', 'n'), 
(' ', ' '), 
('p', 'u'), 
('e', 'n'), ('r', ' '), ('r', 'l'), ('o', 'u'), (' ', 'g'), ('d', 'a'), ('e', 'r'), (' ', ' '), ('s', 'd'), ('a', 'e'), ('n', ' '), ('r', 'l'), ('o', 'a'), ('q', ' '), ('u', 'm'), ('e', 'a')]

# o usando más de dos parejas para construir tuplas de más elementos (4 en este caso)
>>> list(zip(para2, range(9000), para2, paragraph))
[
('E', 0, 'E', 'E'), 
('l', 1, 'l', 'n'), 
(' ', 2, ' ', ' '), 
('p', 3, 'p', 'u'), 
('e', 4, 'e', 'n'), 
('r', 5, 'r', ' '), ('r', 6, 'r', 'l'), ('o', 7, 'o', 'u'), (' ', 8, ' ', 'g'), ('d', 9, 'd', 'a'), ('e', 10, 'e', 'r'), (' ', 11, ' ', ' '), ('s', 12, 's', 'd'), ('a', 13, 'a', 'e'), ('n', 14, 'n', ' '), ('r', 15, 'r', 'l'), ('o', 16, 'o', 'a'), ('q', 17, 'q', ' '), ('u', 18, 'u', 'm'), ('e', 19, 'e', 'a')]

Incluso se pueden usar para crear tuplas de un solo elemento como en el siguiente caso:

>>> triple = [x * 3 for x in range(6)]
>>> letters = zip(triple,)
>>> list(letters)
[(0,), (3,), (6,), (9,), (12,), (15,)]

Solución

Por tanto la solución correcta es la A:

A) »Juan -> 3

Pedro -> 1

María -> 2»


Practica Python con PyQuizzes

En la sección de PyQuizzes puedes encontrar ejercicios prácticos explicados pormenorizado para mejorar tus habilidades como pythonista. ¡No te los pierdas!


Tutorial Python online

Aprender Python de forma gratuita siguiendo las secciones del tutorial de Python.


Libros recomendados para aprender Python

Estos son los libros que pueden ayudarte a aprender Python, aprender a programar, tipos de datos, algoritmia y mucho más.

Disponible en:

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Ver más

  • Responsable: Oscar Ramirez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento: No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a ionos (1&1) que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Publicar un comentario