Продолжение строки для списочных представлений или генераторных выражений в python - PullRequest
97 голосов
/ 27 апреля 2011

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

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

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

Ответы [ 3 ]

131 голосов
/ 27 апреля 2011
[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

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

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)
22 голосов
/ 27 апреля 2011

Я не против:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

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

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

19 голосов
/ 18 февраля 2012

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

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 в его собственную строку также полезно.

...