Continuazione di riga per la comprensione di elenchi o espressioni di generatore in python


102

Come dovresti spezzare una lunghissima lista di comprensione?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Ho anche visto da qualche parte che le persone a cui non piace usare "\" per spezzare le battute, ma non hanno mai capito il motivo. Qual è il motivo dietro questo?


Risposte:


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

funziona bene, quindi puoi praticamente fare quello che vuoi. Personalmente preferirei

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

Il motivo per cui \non è molto apprezzato è che appare alla fine di una riga, dove non si distingue o ha bisogno di imbottitura extra, che deve essere fissata quando la lunghezza della riga cambia:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

In questi casi, usa le parentesi:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)

47
In particolare, le interruzioni di riga vengono ignorate all'interno di qualsiasi parentesi - (), []e {}.

23

Non sono contrario a:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

Non è necessario \in questo caso. In generale, penso che le persone lo evitino \perché è leggermente brutto, ma può anche dare problemi se non è l'ultima cosa sulla linea (assicurati che non lo segua uno spazio bianco). Penso che sia molto meglio usarlo che non, però, al fine di mantenere basse le lunghezze della linea.

Dal momento che \non è necessario nel caso precedente, o per le espressioni tra parentesi, in realtà trovo abbastanza raro che abbia persino bisogno di usarlo.


20

Puoi anche utilizzare più rientri nei casi in cui hai a che fare con un elenco di diverse strutture di dati.

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

Notare come filtra anche su un altro elenco utilizzando un'istruzione if. Anche il rilascio dell'istruzione if sulla propria riga è utile.


1
Mi piace particolarmente questa risposta, in quanto mostra diversi aspetti convenzionali dell'interruzione di riga inclusa la comprensione di elenchi annidati per i forcicli.
gustafbstrom
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.