Tengo dos listas como abajo
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]
Quiero extraer entradas de entries
cuando están en tags
:
result = []
for tag in tags:
for entry in entries:
if tag in entry:
result.extend(entry)
¿Cómo puedo escribir los dos bucles como una comprensión de lista de una sola línea?
python
list
for-loop
list-comprehension
Shiva Krishna Bavandla
fuente
fuente
itertools.chain
si desea una lista plana:list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Respuestas:
Esto debería hacerlo:
fuente
La mejor manera de recordar esto es que el orden del bucle for dentro de la lista de comprensión se basa en el orden en el que aparecen en el enfoque de bucle tradicional. La mayoría de los bucles externos vienen primero y luego los bucles internos posteriormente.
Entonces, la comprensión de la lista equivalente sería:
En general, la
if-else
instrucción viene antes del primer ciclo for, y si solo tiene unaif
instrucción, aparecerá al final. Por ejemplo, si desea agregar una lista vacía, sitag
no está en la entrada, lo haría así:fuente
El LC apropiado sería
El orden de los bucles en el LC es similar al de los bucles anidados, las instrucciones if van al final y las expresiones condicionales van al principio, algo así como
Ver la demostración -
EDITAR : dado que necesita que el resultado se acople, puede usar una lista de comprensión similar y luego acoplar los resultados.
Sumando esto, podrías hacer
Aquí usa una expresión generadora en lugar de una lista de comprensión. (También coincide perfectamente con el límite de 79 caracteres (sin la
list
llamada))fuente
Salida:
fuente
En comprensión, la iteración de listas anidadas debe seguir el mismo orden que los bucles for imbricados equivalentes.
Para entenderlo, tomaremos un ejemplo sencillo de PNL. Desea crear una lista de todas las palabras a partir de una lista de oraciones donde cada oración es una lista de palabras.
Para eliminar las palabras repetidas, puede utilizar un conjunto {} en lugar de una lista []
o aplicar
list(set(all_words))
fuente
fuente