Kontynuacja wiersza dla wyrażeń listowych lub wyrażeń generatora w Pythonie

102

Jak masz przerwać rozumienie bardzo długiej listy?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Widziałem też gdzieś ludzi, którzy nie lubią używać znaku '\' do przerywania linii, ale nigdy nie rozumieli dlaczego. Jaki jest tego powód?

sasker
źródło
3
możliwy duplikat Jak wciskać listy składane w Pythonie?
Cristian Ciupitu

Odpowiedzi:

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

działa dobrze, więc możesz robić, co chcesz. Osobiście wolałbym

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

Powodem, dla którego \nie jest bardzo doceniany, jest to, że pojawia się na końcu linii, gdzie albo nie wyróżnia się, albo wymaga dodatkowego wypełnienia, które należy naprawić, gdy zmieniają się długości linii:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

W takich przypadkach użyj parens:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)
Fred Foo
źródło
47
Konkretnie, podziały wiersza są ignorowane wewnątrz żadnych wsporników - (), []i {}.
23

Nie jestem przeciwny:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

Nie potrzebujesz \w tym przypadku. Ogólnie myślę, że ludzie unikają tego, \ponieważ jest trochę brzydki, ale może też powodować problemy, jeśli nie jest to ostatnia rzecz w wierszu (upewnij się, że nie następuje po nim spacja). Myślę jednak, że znacznie lepiej jest go używać niż nie, aby zmniejszyć długość linii.

Ponieważ \nie jest to konieczne w powyższym przypadku lub w przypadku wyrażeń w nawiasach, w rzeczywistości wydaje mi się, że dość rzadko muszę go używać.

Dan Breen
źródło
20

Możesz również skorzystać z wielu wcięć w przypadkach, gdy masz 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
    ]
]

Zwróć uwagę, jak filtruje również na inną listę za pomocą instrukcji if. Przydatne jest również upuszczenie instrukcji if do jej własnego wiersza.

MrOodles
źródło
1
Szczególnie podoba mi się ta odpowiedź, ponieważ pokazuje kilka konwencjonalnych aspektów łamania linii, w tym rozumienie zagnieżdżonych list dla forpętli.
gustafbstrom