Zip listas en Python

5 minutos de lectura

Zip listas en Python
AJW

Estoy tratando de aprender a “comprimir” listas. Para ello, tengo un programa, donde en un punto determinado, hago lo siguiente:

x1, x2, x3 = stuff.calculations(withdataa)

Esto me da tres listas, x1, x2y x3cada uno de, digamos, tamaño 20.

Ahora lo hago:

zipall = zip(x1, x2, x3)

Sin embargo, cuando hago:

print "len of zipall %s" % len(zipall)

Obtuve 20, que no es lo que esperaba. Esperaba tres. Creo que estoy haciendo algo fundamentalmente mal.

  • ¿Qué estás esperando exactamente? zip ¿que hacer? ¿Por qué debería tener tres listas? ¿Cómo se verían?

    – Daniel Rosemann

    4 de diciembre de 2012 a las 14:14

  • zip devuelve una lista de tuplas.

    – Demostración

    19 de agosto de 2018 a las 1:13

Cuando usted zip() juntas tres listas que contienen 20 elementos cada una, el resultado tiene veinte elementos. Cada elemento es una tupla de tres.

Ver por ti mismo:

In [1]: a = b = c = range(20)

In [2]: zip(a, b, c)
Out[2]: 
[(0, 0, 0),
 (1, 1, 1),
 ...
 (17, 17, 17),
 (18, 18, 18),
 (19, 19, 19)]

Para averiguar cuántos elementos contiene cada tupla, puede examinar la longitud del primer elemento:

In [3]: result = zip(a, b, c)

In [4]: len(result[0])
Out[4]: 3

Por supuesto, esto no funcionará si las listas estaban vacías al principio.

  • len(resultado[0]) no funcionará. El objeto ‘zip’ no se puede suscribir

    – GilbertS

    23 de febrero de 2020 a las 16:23

  • @GilbertS en Python 2 zip devolvió una lista. En Python 3 es un iterador

    – Tomerikoo

    23 de marzo de 2020 a las 13:34


  • @GilbertS en el uso de Python 3 list(zip(a, b, c)) para obtener el comportamiento de Python 2.

    – tricasse

    26 de septiembre de 2020 a las 9:26

zip toma un montón de listas de “me gusta”

a: a1 a2 a3 a4 a5 a6 a7...
b: b1 b2 b3 b4 b5 b6 b7...
c: c1 c2 c3 c4 c5 c6 c7...

y los “comprime” en una lista cuyas entradas son 3 tuplas (ai, bi, ci). Imagina dibujar una cremallera horizontalmente de izquierda a derecha.

  • @Sigur: “Convertir tupla a lista y viceversa”

    –David Cary

    29 de agosto de 2017 a las 11:47

Zip listas en Python
Ajay

En Python 2.7 esto podría haber funcionado bien:

>>> a = b = c = range(20)
>>> zip(a, b, c)

Pero en Python 3.4 debería ser (de lo contrario, el resultado será algo así como <zip object at 0x00000256124E7DC8>):

>>> a = b = c = range(20)
>>> list(zip(a, b, c))

zip crea una nueva lista, llena de tuplas que contienen elementos de los argumentos iterables:

>>> zip ([1,2],[3,4])
[(1,3), (2,4)]

Espero que lo que intentes sea crear una tupla donde cada elemento sea una lista.

Zip listas en Python
Shivid

En Pitón 3 zip en su lugar, devuelve un iterador y debe pasarse a una función de lista para obtener las tuplas comprimidas:

x = [1, 2, 3]; y = ['a','b','c']
z = zip(x, y)
z = list(z)
print(z)
>>> [(1, 'a'), (2, 'b'), (3, 'c')]

Entonces a unzip volver a conjugar el iterador comprimido:

x_back, y_back = zip(*z)
print(x_back); print(y_back)
>>> (1, 2, 3)
>>> ('a', 'b', 'c')

Si se necesita la forma original de lista en lugar de tuplas:

x_back, y_back = zip(*z)
print(list(x_back)); print(list(y_back))
>>> [1,2,3]
>>> ['a','b','c']

  • La etiqueta de pregunta indica Python 2.7; esto es para Python 3. Además, esta respuesta ya menciona esto.

    – 9769953

    27 de mayo de 2018 a las 14:22

  • @ 9769953 Esta respuesta es útil. Estaba buscando listas zip de Google en Python, no en Python 2.7.

    – rubengavidia0x

    10 de noviembre de 2021 a las 17:41

Fuente: Mi publicación de blog (mejor formato)

Ejemplo

numbers = [1,2,3]
letters="abcd"

zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]

Aporte

Cero o más iterables [1] (por ejemplo, lista, cadena, tupla, diccionario)

Producción (lista)

1ª tupla = (elemento_1 de números, elemento_1 de letras)

2da tupla = (e_2 números, e_2 letras)

n-ésima tupla = (e_n números, e_n letras)

  1. Lista de n tuplas: n es la longitud del argumento más corto (entrada)
    • len(números) == 3
  2. Longitud de cada tupla = # de argumentos (la tupla toma un elemento de cada argumento)
    • argumentos = (números, letras); len(args) == 2 → tupla con 2 elementos
  3. itupla = (element_i arg1, element_i arg2…, element_i argn)

Casos de borde

1) Cadena vacía: len(str)= 0 = sin tuplas

2) Cadena única: len(str) == 2 tuplas con len(args) == 1 elemento(s)

zip()
# []
zip('')
# []
zip('hi')
# [('h',), ('i',)]

Zip en acción!

1. Construye un diccionario [2] de dos listas

keys = ["drink","band","food"]
values = ["La Croix", "Daft Punk", "Sushi"]

my_favorite = dict( zip(keys, values) )

my_favorite["drink"]
# 'La Croix'

my_faves = dict()
for i in range(len(keys)):
    my_faves[keys[i]] = values[i]
  • zip es una solución elegante, clara y concisa

2. Imprimir columnas en una tabla

“*” [3] se llama “desempacar”: f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)

student_grades = [
[   'Morty'  ,  1   ,  "B"  ],
[   'Rick'   ,  4   ,  "A"  ],
[   'Jerry'  ,  3   ,  "M"  ],
[  'Kramer'  ,  0   ,  "F"  ],
]

row_1 = student_grades[0]
print row_1
# ['Morty', 1, 'B']

columns = zip(*student_grades)
names = columns[0]
print names
# ('Morty', 'Rick', 'Jerry', 'Kramer')

Crédito Extra: Descomprimir

zip(*args) se llama “descomprimir” porque tiene el efecto inverso de zip

numbers = (1,2,3)
letters = ('a','b','c')

zipped = zip(numbers, letters)
print zipped
# [(1, 'a'), (2, 'b'), (3, 'c')]

unzipped = zip(*zipped)
print unzipped
# [(1, 2, 3), ('a', 'b', 'c')]
  • unzipped: tuple_1 = e1 de cada tupla comprimida. tuple_2 = e2 de cada uno zipped

notas al pie

  1. Un objeto capaz de devolver sus miembros uno a la vez (por ejemplo, list [1,2,3]cadena ‘Me gusta codificar’, tupla (1,2,3), diccionario {‘a’:1, ‘b’:2})
  2. {clave1:valor1, clave2:valor2…}
  3. “Desembalaje”

*

# foo - function, returns sum of two arguments
def foo(x,y):
    return x + y
print foo(3,4)
# 7

numbers = [1,2]
print foo(numbers)
# TypeError: foo() takes exactly 2 arguments (1 given)

print foo(*numbers)
# 3

* Código: numbers tomó

  • (1 argumento) y “desempaquetado” sus 2 elementos en 2 argumentos

    La etiqueta de pregunta indica Python 2.7; esto es para Python 3. Además, esta respuesta ya menciona esto.

    – 9769953

  • 27 de mayo de 2018 a las 14:22

    @ 9769953 Esta respuesta es útil. Estaba buscando listas zip de Google en Python, no en Python 2.7.

    – rubengavidia0x

Zip listas en Python
10 de noviembre de 2021 a las 17:41

Pedro Mortensen

Básicamente, la función zip funciona en listas, tuplas y diccionarios en Python. Si está utilizando IPython, simplemente escriba zip? Y verifique de qué se trata zip().

Si no está utilizando IPython, simplemente instálelo: “pip install ipython”

a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
zip(a, b)

para listas [('a', 'p'), ('b', 'q'), ('c', 'r')

For dictionary:

c = {'gaurav':'waghs', 'nilesh':'kashid', 'ramesh':'sawant', 'anu':'raje'}
d = {'amit':'wagh', 'swapnil':'dalavi', 'anish':'mane', 'raghu':'rokda'}
zip(c, d)

The output is:

[('gaurav', 'amit'),
 ('nilesh', 'swapnil'),
 ('ramesh', 'anish'),
 ('anu', 'raghu')]

  • la salida es

    zip(c,d) está realizando zip(lista(c), lista(d))

    – Stephen Woodbridge

¿Ha sido útil esta solución?