Zeilenfortsetzung für Listenverständnisse oder Generatorausdrücke in Python

102

Wie soll man ein sehr langes Listenverständnis auflösen?

[something_that_is_pretty_long for something_that_is_pretty_long in somethings_that_are_pretty_long]

Ich habe auch irgendwo gesehen, dass Leute, die es nicht mögen, '\' zu verwenden, um Linien aufzubrechen, aber nie verstanden haben, warum. Was ist der Grund dafür?

Sasker
quelle
3
Mögliches Duplikat von Wie werden Python-Listenverständnisse eingerückt?
Cristian Ciupitu

Antworten:

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

funktioniert gut, so dass Sie so ziemlich alles tun können, was Sie möchten. Ich persönlich würde es vorziehen

 [something_that_is_pretty_long
  for something_that_is_pretty_long
  in somethings_that_are_pretty_long]

Der Grund, warum \nicht sehr geschätzt wird, ist, dass es am Ende einer Linie erscheint, wo es entweder nicht auffällt oder zusätzliche Polsterung benötigt, die behoben werden muss, wenn sich die Linienlängen ändern:

x = very_long_term                     \
  + even_longer_term_than_the_previous \
  + a_third_term

Verwenden Sie in solchen Fällen parens:

x = (very_long_term
     + even_longer_term_than_the_previous
     + a_third_term)
Fred Foo
quelle
47
Insbesondere Zeilenumbrüche innerhalb ignoriert jegliche Klammern - (), []und {}.
23

Ich bin nicht dagegen:

variable = [something_that_is_pretty_long
            for something_that_is_pretty_long
            in somethings_that_are_pretty_long]

Sie brauchen \in diesem Fall nicht. Im Allgemeinen denke ich, dass die Leute es vermeiden, \weil es etwas hässlich ist, aber auch Probleme verursachen kann, wenn es nicht das allerletzte auf der Linie ist (stellen Sie sicher, dass kein Leerzeichen darauf folgt). Ich denke, es ist viel besser, es zu verwenden als nicht, um Ihre Leitungslängen niedrig zu halten.

Da \dies im obigen Fall oder für in Klammern gesetzte Ausdrücke nicht erforderlich ist, finde ich es tatsächlich ziemlich selten, dass ich es überhaupt verwenden muss.

Dan Breen
quelle
20

Sie können auch mehrere Einrückungen verwenden, wenn Sie mit einer Liste mehrerer Datenstrukturen arbeiten.

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

Beachten Sie, wie es auch mit einer if-Anweisung in eine andere Liste filtert. Es ist auch nützlich, die if-Anweisung in eine eigene Zeile zu setzen.

MrOodles
quelle
1
Diese Antwort gefällt mir besonders gut, da sie verschiedene konventionelle Aspekte des Zeilenumbruchs zeigt, einschließlich des Verständnisses verschachtelter Listen für forSchleifen.
Gustafbstrom