2011-04-27 4 views
78

¿Cómo se supone que debes dividir una lista de comprensión muy larga?Continuación de línea para comprensión de listas o expresiones de generador en python

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long] 

También he visto en alguna parte que las personas que no les gusta usar '\' para romper las líneas, pero nunca entendido por qué. Cuál es la razón detrás de esto?

+3

posible duplicado de [¿Cómo sangrar las listas de comprensión de Python?] (Http://stackoverflow.com/questions/311588/how-to-indent-python-list-comprehensions) –

Respuesta

107
[x 
for 
x 
in 
(1,2,3) 
] 

funciona bien, por lo que puede hacer casi lo que quiera. Yo personalmente prefiero

[something_that_is_pretty_long 
    for something_that_is_pretty_long 
    in somethings_that_are_pretty_long] 

La razón por la \ no se aprecia mucho es que aparece al final de una línea, donde, o bien no se destaca o necesita relleno adicional, que tiene que se fija cuando la línea longitudes de cambio:

x = very_long_term      \ 
    + even_longer_term_than_the_previous \ 
    + a_third_term 

En tales casos, el uso parens:

x = (very_long_term 
    + even_longer_term_than_the_previous 
    + a_third_term) 
+34

Específicamente, se ignoran los saltos de línea dentro * cualquier * paréntesis - '()', '[]' y '{}'. – delnan

17

no me opongo a:

variable = [something_that_is_pretty_long 
      for something_that_is_pretty_long 
      in somethings_that_are_pretty_long] 

No necesita \ en este caso. En general, creo que la gente evita \ porque es un poco feo, pero también puede causar problemas si no es lo último en la línea (asegúrese de que no haya espacios en blanco). Sin embargo, creo que es mucho mejor usarlo que no para mantener la longitud de tus líneas.

Dado que \ no es necesario en el caso anterior, o para expresiones entre paréntesis, en realidad me parece bastante raro que incluso necesite usarlo.

16

También puede hacer uso de varias indentaciones en los casos en que se trata de una lista de varias estructuras de datos.

new_list = [ 
    { 
     'attribute 1': a_very_long_item.attribute1, 
     'attribute 2': a_very_long_item.attribute2, 
     'list_attribute': [ 
      { 
       'dict_key_1': attribute_item.attribute2, 
       'dict_key_2': attribute_item.attribute2 
      } 
      for attribute_item 
      in a_very_long_item.list_of_items 
     ] 
    } 
    for a_very_long_item 
    in a_very_long_list 
    if a_very_long_item not in [some_other_long_item 
     for some_other_long_item 
     in some_other_long_list 
    ] 
] 

Observe cómo también se filtra a otra lista usando una instrucción if. Dejar caer la instrucción if en su propia línea también es útil.

Cuestiones relacionadas