web-dev-qa-db-ja.com

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

非常に長いリストの理解をどのように分割するのですか?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

また、どこかで「\」を使用して行を分割することを好まない人々を見たことがありますが、その理由は理解できませんでした。この背後にある理由は何ですか?

98
sasker
[x
 for
 x
 in
 (1,2,3)
]

正常に動作しますので、好きなようにできます。私は個人的に好む

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

\は、行のendに表示されることをあまり認識していません。この場合、目立たないか、余分なパディングが必要になります。

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)
134
Fred Foo

私は反対していません:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

この場合、\は必要ありません。一般に、人々は\は少しavoidいので避けていると思いますが、それが最後の行ではない場合にも問題を引き起こす可能性があります(それに続く空白がないことを確認してください)。ただし、行の長さを短くするためには、使用するよりも使用する方がずっと良いと思います。

\は上記の場合、または括弧で囲まれた式には必要ないため、実際に使用する必要があることはかなりまれです。

22
Dan Breen

複数のデータ構造のリストを処理している場合、複数のインデントを使用することもできます。

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ステートメントを独自の行にドロップすることも有用です。

19
MrOodles