Problema en la comprensión de las listas de comprensión de Python

¿Qué significa la última línea en el siguiente código?

import pickle, urllib handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p") data = pickle.load(handle) handle.close() for elt in data: print "".join([e[1] * e[0] for e in elt]) 

Mi bash por el problema:

  • “” .join … usa join -method para vaciar texto
  • e [1] * e [0] multiplica dos valores subsiguientes en la secuencia, e
  • No estoy seguro de que es e
  • No estoy seguro, qué significa, cuando tienes algo antes para -loop, como: e[1] * e[0] for e in elt

Quizás mejor explicado con un ejemplo:

 print "".join([e[1] * e[0] for e in elt]) 

es la forma corta de

 x = [] for e in elt: x.append(e[1] * e[0]) print "".join(x) 

Las comprensiones de listas son simplemente azúcar sintáctica for bucles for , que hacen una expresión de una secuencia de sentencias.

elt puede ser un objeto arbitrario, ya que lo carga desde encurtidos, e igualmente. El uso sugiere que es un tipo de secuencia , pero podría ser cualquier cosa que implemente el protocolo de secuencia.

En primer lugar, debe poner http: // delante de la URL, es decir: handle = urllib.urlopen (” http://www.pythonchallenge.com/pc/def/banner.p “)

Una expresión [e for e in aList] es una lista de comprensión que genera una lista de valores.

Con las cadenas de Python, el operador * se usa para repetir una cadena. Intente escribir los comandos uno por uno en un intérprete y luego observe los datos:

 >>> data[0] [(' ', 95)] 

Esto nos muestra que cada línea de datos es una tupla que contiene dos elementos.

Así, la expresión e 1 * e [0] es efectivamente la cadena en e [0] repetida e 1 veces.

De ahí el progtwig dibuja un banner.

[e[1] * e[0] for e in elt] es una lista de comprensión, que se evalúa como una lista en sí misma al recorrer otra lista, en este caso elt . Cada elemento en la nueva lista es e[1]*e[0] , donde e es el elemento correspondiente en elt .

La pregunta en sí ya ha sido respondida por completo, pero me gustaría agregar que una lista de comprensión también admite el filtrado. Tu linea original

 print "".join([e[1] * e[0] for e in elt]) 

podría, como ejemplo, convertirse

 print "".join([e[1] * e[0] for e in elt if len(e) == 2]) 

Para operar solo en artículos en elt que tengan dos elementos.

join () es un método de cadena, que funciona en un separador en una cadena nueva

 >>> ':'.join(['ab', 'cd']) >>> 'ab:cd' 

y la lista de comprensión no es necesaria allí, el generador sería suficiente

¡Andy es una gran respuesta!

Si desea ver cada paso del bucle (con saltos de línea), intente esto:

 for elt in data: for e in elt: print "e[0] == %s, e[1] == %d, which gives us: '%s'" % (e[0], e[1], ''.join(e[1] * e[0]))