Продолжение строки для понимания списков или выражений генератора в python

102

Как вы должны разбить понимание очень длинного списка?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Я также где-то видел, что люди, которым не нравится использовать "\" для разрыва строк, но никогда не понимали почему. В чем причина этого?

саскер
источник
3
возможный дубликат Как сделать отступ в списках Python?
Cristian Ciupitu

Ответы:

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

работает нормально, так что вы можете делать все, что захотите. Я лично предпочитаю

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

Причина, по которой \это не очень ценится, заключается в том, что он появляется в конце строки, где он либо не выделяется, либо требует дополнительных отступов, которые необходимо исправить при изменении длины строки:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

В таких случаях используйте паренсы:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)
Фред Фу
источник
47
В частности, разрывы строк игнорируются в любых скобках - (), []и {}.
23

Я не против:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

\В этом случае вам не нужно . В общем, я думаю, что люди избегают, \потому что это немного некрасиво, но также может вызвать проблемы, если это не самое последнее в строке (убедитесь, что за ним нет пробелов). Я думаю, что гораздо лучше использовать его, чем нет, чтобы сократить длину лески.

Поскольку \это не обязательно в приведенном выше случае или для выражений в скобках, я на самом деле нахожу довольно редко, что мне даже нужно его использовать.

Дэн Брин
источник
20

Вы также можете использовать несколько отступов в тех случаях, когда имеете дело со списком из нескольких структур данных.

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

Обратите внимание, как он также фильтруется в другой список с помощью оператора if. Также полезно переносить оператор if в отдельную строку.

MrOodles
источник
1
Мне особенно нравится этот ответ, поскольку он показывает несколько традиционных аспектов разрыва строки, включая понимание вложенных списков для forциклов.
gustafbstrom