Python Quiz 13 – Combinar elementos en tuplas con ZIP
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.