für-wenn auch ohne Liste Verständnis in einer Zeile
können diese in eine Zeile geschrieben werden, ohne Liste Verstehens?
for x in vec:
if x > 3:
...
...
- Warum nicht? / Warum 1 Zeile?
- Ich bin nicht allzu vertraut mit Ihnen, würde aber eine
lambda
Aussage angemessen? - Ein
lambda
allein wäre Unsinn. Als Prädikat füri-/filter
, ja. - Hängt davon ab, was du damit meinst "das". Welche Kriterien muss Sie erfüllen, um als äquivalent zu dem code, den Sie gab? Offensichtlich 100% äquivalenz bedeuten würde, dauerte es mehr als eine Zeile.
- Wenn x ist ein großes Wort, ich muss zu geben es zweimal ein. Ich Frage mich, ob es einen Weg gibt, um eine Bedingung hinzuzufügen, um die Schleife direkt
- Auch, hat der einen Linie sind die Anweisungen innerhalb des "if", oder nur die für und die wenn?
- Ich muss es zweimal, ich bin so froh, Sie haben demonstriert, warum ich gewählt, um in der Nähe diese Frage.
- Ich wusste von der Absicht der Programmierer ändert den Wert der Frage. In der Tat ist der Wert in den Inhalten, nicht in der Absicht.
- Beachten Sie, dass der saubere Weg dies zu tun ist nicht, was der Zustand in einen lambda-Ausdruck oder eine unangenehme generator-Ausdruck; sagen Sie einfach nur
for x in vec: if x <= 3: continue; ...
. "Tun Sie es in einer Zeile" ist nur selten eine geeignete design-Einschränkung.
InformationsquelleAutor Roberto | 2010-11-19
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, können Sie nicht. Die Python language reference Staaten:
In der Tat, Python erzeugt eine
SyntaxError
für die geschachtelte ifs oben. Mehr formal in Bezug auffor
, das ist die Grammatik in Python:Beachten Sie, dass, wenn
for
wird gefolgt von einer Anweisung ohne eine Einbuchtung, diese Aussage muss einstmt_list
, die nur ermöglichtsimple_stmt
Instanzen.simple_stmt
ist diese:Die enthalten nicht-zusammengesetzte Aussagen wie
if
undfor
.Sagte, beachten Sie, dass Python-syntax richtet sich an Klarheit. Daher ist es besser, nicht zu brüten, solche Aussagen, das ist, was Generatoren/Liste Verstehens wurden. Wenn Sie meinen, dass Ihre Berechnung einfach genug sein für eine einzige Linie, dann Verstehens sind für Sie. Sonst, Sie wirklich nicht wollen, verunstalteten Sie den code, indem alles auf eine einzige Linie - brechen es auf den Punkt, mit Einrückung. Ein paar Zeilen extra-Kosten nicht viel in diesen Tagen.
x
-, rendering-Liste Verstehens eine inakzeptable Lösung. Liste Verstehens sind nicht ein Weg, um jede Schleife in einem einzigen oneliner.ifilter
zu tun, die Filterung.Siehe @KennyTM... kein Grund zu komprimieren, dass viel.
Was gesagt wird,
for x in (i in vec if i > 3)
macht den job, als auchitertools.ifilter
(oder nur die builtinfilter
in Python 3) mit einemlambda x: x > 3
Prädikat. Sie arbeiten mit allen iterables als gut, und faul sind (z.B. wenn Siebreak
während der Loop-Schleife nicht überprüfen, einen einzigen Punkt zu viel).filter
+lambda
ist die geeignete Antwort für diese Frage....Kann es, aber Liste Verstehens/generator-Ausdrücke sind genau die Art von Sache, die hier verwendet werden soll. Je nachdem, was Sie wollen in Ihrem
if
block, Sie könnte verwenden irgendeine form vonmap
oderreduce
, aber Liste Verstehens-und generator-Ausdrücke sind wahrscheinlich der beste Weg, es zu tun.Ja
for x in filter(lambda i:ich>3,vec):
Können Sie sich vorstellen, etwas wie dieses :
...
sind einige Aussagen, in welchem Fall eine Liste Verständnis wäre nicht idiomatisch.