Pythonのリスト内包表記またはジェネレータ式の行継続


102

非常に長いリストの理解をどのように分解することになっていますか?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

また、「\」を使用して行を分割することを嫌う人もいますが、その理由はわかりません。この背後にある理由は何ですか?


回答:


142
[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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.