Продовження рядка для розуміння списку або виразів генератора в python


102

Як ви повинні розбити дуже довгий список розуміння?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Я також десь бачив, що люди, які не люблять використовувати "\" для розбиття рядків, але ніколи не розуміли, чому. У чому причина цього?


Відповіді:


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 у свій рядок.


1
Особливо мені подобається ця відповідь, оскільки вона показує декілька звичайних аспектів розриву рядків, включаючи розуміння вкладеного списку для forциклів.
gustafbstrom
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.