Kelanjutan baris untuk pemahaman daftar atau ekspresi generator dalam python

102

Bagaimana Anda bisa memecah pemahaman daftar yang sangat panjang?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Saya juga telah melihat suatu tempat di mana orang-orang tidak suka menggunakan '\' untuk memutuskan baris, tetapi tidak pernah mengerti mengapa. apa alasan dibalik ini?

sasker
sumber
3
kemungkinan duplikat dari Bagaimana mengindentasi daftar-pemahaman Python?
Cristian Ciupitu

Jawaban:

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

berfungsi dengan baik, jadi Anda dapat melakukan banyak hal sesuka Anda. Saya pribadi lebih suka

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

Alasan mengapa \tidak terlalu dihargai adalah karena itu muncul di akhir baris, di mana ia tidak menonjol atau membutuhkan bantalan ekstra, yang harus diperbaiki ketika panjang baris berubah:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

Dalam kasus seperti itu, gunakan tanda kurung:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)
Fred Foo
sumber
47
Secara khusus, jeda baris diabaikan di dalam tanda kurung apa pun - (), []dan {}.
23

Saya tidak menentang:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

Anda tidak perlu \dalam kasus ini. Secara umum, saya pikir orang menghindari \karena itu sedikit jelek, tetapi juga dapat memberikan masalah jika itu bukan hal terakhir di telepon (pastikan tidak ada spasi yang mengikutinya). Saya pikir jauh lebih baik menggunakannya daripada tidak, untuk menjaga panjang garis Anda.

Karena \tidak diperlukan dalam kasus di atas, atau untuk ekspresi dalam tanda kurung, saya sebenarnya merasa sangat jarang bahwa saya bahkan perlu menggunakannya.

Dan Breen
sumber
20

Anda juga dapat menggunakan beberapa lekukan jika Anda berurusan dengan daftar beberapa struktur data.

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

Perhatikan bagaimana itu juga memfilter ke daftar lain menggunakan pernyataan if. Menghapus pernyataan if ke barisnya sendiri juga berguna.

MrOodles
sumber
1
Saya sangat menyukai jawaban ini, karena ini menunjukkan beberapa aspek konvensional pemutusan garis termasuk pemahaman daftar bersarang untuk forloop.
mulai dari