2011-10-07 16 views
9

Me gustaría saber cómo realizar múltiples comandos en una lista de comprensión.acciones múltiples en lista de comprensión python

¿Me puede dar un ejemplo de algo tan simple como:

[print ("bla1") and print ("bla2") for i in list] 

por lo que para una lista de longitud 4 4 Tendría:

bla1 
bla2 
bla1 
bla2 
bla1 
bla2 
bla1 
bla2 

Dtrangely suficiente No se encontró fácilmente en la documentación. (Si puede ver una razón obvia por la que no lo hice y puede dejarme saber cómo debería buscar esas cosas que serían aún mejores).

EDITAR: OK, ese fue un muy mal ejemplo según los comentarios. I am interesado en crear uno nuevo a partir de uno antiguo, pero creo que necesito dos comandos para hacerlo. (no una simple impresión, por supuesto). Por ejemplo. Tengo una lista de listas, y quiero crear una lista que sea el resultado de la manipulación de las sublistas.

+2

Si haces que tus listas de comprensión sean demasiado complicadas, es probable que se vuelvan ... incomprensibles. –

+0

En Python 3, donde 'print' es una función, una variante simple de ese código funcionará. Sin embargo, sigue siendo una mala forma de hacerlo. –

+0

"dos comandos"? ¿Puedes darnos ejemplos de lo que piensas que quieres decir con esto? No es claro. Un "comando" no tiene ningún significado formal de Python. ¿Te refieres a "declaración"? Si es así, una lista de comprensión no puede funcionar. ¿Te refieres a "función" o "expresión"? Si es así, un ejemplo ayudaría a aclarar por qué son dos expresiones. –

Respuesta

21

No utilice la lista de comprensión para los comandos. Las listas de comprensión son para creando listas, no para comandos. Utilizar un bucle simple y llano:

for i in list: 
    print('bla1') 
    print('bla2') 

listas por comprensión son maravillosas cosas increíbles llenos de unicornios y chocolate, pero no son una solución para todo.

+3

Yo no los llamaría mágicos. – varunl

+2

Tienes razón. Aclaré lo que quería decir, con suerte sin las connotaciones negativas ahora. –

+0

¿Hay algo en PEP que especifique esto o solo es una convención que las personas tienden a seguir? Veo a mucha gente usando list-comps para los comandos. –

2
  1. Las listas por comprensión son sólo para la generación de datos en forma de lista, no para ejecutar sentencias (o cualquier otro efecto secundario, como escribir en un archivo) varias veces. Use un for para eso.

  2. Suponiendo que desea generar una lista ['bla1', 'bla2', 'bla1', ...]: No puede hacerlo en general, cada iteración coloca un único valor de resultado en la lista. Ese valor puede ser una lista en sí misma, pero luego tiene una lista de listas.

  3. En casos específicos como tu ejemplo, es posible sin embargo: Uso ['bla' + str(i + 1) for x in list for i in range(2)], que itera sobre range(2) para cada x in list, y por lo tanto genera dos valores por artículo en list. (list es un mal nombre para una variable, aunque, como ya está tomada por la orden interna.)

1

Si "Necesito dos comandos" significa que hay dos funciones, deben estar relacionados de alguna manera.

def f(element): 
    return intermediate 

def g(intermediate): 
    return final 

new_list = [ g(f(x)) for x in old_list ] 

Si ese no es el caso, tendrá que proporcionar definiciones de funciones que (a) no se pueden componer y, sin embargo también (b) crear un único resultado para la nueva secuencia.

0

Use la comprensión de la lista solo para crear listas. Su ejemplo no usa los valores de su lista en absoluto.

De acuerdo con los documentos:
"Las listas de comprensión proporcionan una forma concisa para crear listas de secuencias."

for i in range(len(your_list)): 
    print "blah1" 
    print "blah2" 

En el programa anterior, ni siquiera nos importaron los valores de la lista.Si buscaba una aplicación diferente de comprensión de la lista de la que indicó en su problema, publique.

0

Por lo que vale la pena es posible usar list.append en la lista de comprensión para producir una nueva lista sin tener en cuenta el resultado principal de la lista de comprensión. El OP menciona una lista de listas. Tomemos, por ejemplo:

>>> master = [range(x,x+2) for x in range(10)] 
>>> master 
[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]] 

continuación, crear una nueva lista mediante la manipulación de cada sublista (como el PO se describe en la edición)

>>> new_list = [] 
>>> [[new_list.append(l[0]*l[1]),new_list.append(l[0]+l[1])] for l in master] 

[[None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None]] 

>>> new_list 

[0, 1, 2, 3, 6, 5, 12, 7, 20, 9, 30, 11, 42, 13, 56, 15, 72, 17, 90, 19] 

Esto escupió una lista redundante de listas con Nones, sino también llena la variable nueva_lista con el producto y la suma de las sublistas.

6

Puede utilizar tupla para hacer que el trabajo de esta manera:

[(print("bla1"), print("bla2")) for i in list] 

es un trabajo correctamente.

+0

esto me ayudó ... solo me preguntaba por qué funcionaba escribir en 'tuple'? –

Cuestiones relacionadas