2011-04-27 16 views
78

Jak ma się rozpaść bardzo długa lista?Kontynuacja linii dla wyrażeń listowych lub wyrażeń generatora w pythonie

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long] 

widziałem też gdzieś, że ludzie, którzy nie lubią używając „\” zerwać linie ale nigdy nie rozumiał, dlaczego. Jaki jest tego powód?

+3

prawdopodobny duplikat [How to indent Python list-rozumienia?] (Http://stackoverflow.com/questions/311588/how-to-indent-python-list-comprehensions) –

Odpowiedz

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

działa dobrze, więc możesz zrobić to, co chcesz. Chciałbym osobiście wolę

[something_that_is_pretty_long 
    for something_that_is_pretty_long 
    in somethings_that_are_pretty_long] 

Powodem \ nie jest doceniana bardzo jest to, że pojawia się na końcu linii, gdzie albo nie wyróżnia się czy potrzebuje dodatkowej wyściółki, która ma który zostanie ustalony, gdy linia długości zmiana:

x = very_long_term      \ 
    + even_longer_term_than_the_previous \ 
    + a_third_term 

W takich przypadkach zastosowanie parens:

x = (very_long_term 
    + even_longer_term_than_the_previous 
    + a_third_term) 
+34

W szczególności, podziały wierszy są ignorowane wewnątrz * dowolne * nawiasy - '()', '[]' i '{}'. – delnan

17

nie jestem przeciwny:

variable = [something_that_is_pretty_long 
      for something_that_is_pretty_long 
      in somethings_that_are_pretty_long] 

W tym przypadku nie potrzebujesz \. Ogólnie rzecz biorąc, uważam, że ludzie unikają \, ponieważ jest to nieco brzydkie, ale może też dawać problemy, jeśli nie jest to ostatnia rzecz na linii (upewnij się, że nie podąża za nim żaden spacja). Myślę, że znacznie lepiej jest go używać, niż nie, aby zmniejszyć długość linii.

Od \ nie jest konieczne w powyższym przypadku, lub w przypadku wyrażeń w nawiasach, uważam, że jest to dość rzadkie, że nawet potrzebuję go użyć.

16

Można również użyć wielu wcięć w przypadku, gdy mamy do czynienia z listą kilku struktur danych.

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 
    ] 
] 

Zauważ, jak również filtruje na inną listę używając instrukcji if. Pomijanie instrukcji if do własnej linii również jest użyteczne.

Powiązane problemy