Wie kann ich in Python Folgendes tun?
row = [unicode(x.strip()) for x in row if x is not None else '']
Im Wesentlichen:
- Ersetzen Sie alle Nones durch leere Zeichenfolgen und dann
- eine Funktion ausführen.
python
list-comprehension
AP257
quelle
quelle
Antworten:
Das kannst du total machen. Es ist nur ein Bestellproblem:
Allgemein,
Und für Listenverständnisse
if
nur mit Bedingungen,Beachten Sie, dass dies tatsächlich nutzt eine andere Sprachkonstrukt, ein Bedingungsausdruck , der selbst nicht Bestandteil der ist Verständnis Syntax , während der
if
nach derfor…in
Teil der Liste Comprehensions und dazu verwendet, ist Filterelemente von der Quelle iterable.Bedingte Ausdrücke können in allen Situationen verwendet werden, in denen Sie basierend auf einer bestimmten Bedingung zwischen zwei Ausdruckswerten wählen möchten. Dies entspricht dem ternären Operator
?:
, der in anderen Sprachen vorhanden ist . Zum Beispiel:quelle
l = [ 2, 3, 4, 5]
dann[x if x % 2 == 0 for x in l]
gib mir fehler wohingegen[x if x % 2 == 0 else 200 for x in l]
funktioniert. Ja, ich weiß, um es zu filtern, sollte ich schreiben[ x for x in l if x % 2 == 0]
. Entschuldigung für die Mühe. Danke für deine Antwort.Einweg:
Obwohl Sie dann haben:
Oder Sie können ein Lambda Inline verwenden.
quelle
if
Ausdruck oder Code in seinem oder demelse
s-Anweisungsblock behandeln müssen. Die akzeptierte Antwort ist für einfache Fälle besser.Hier ist ein weiteres anschauliches Beispiel:
Es nutzt die Tatsache aus, dass für und für alle anderen von der Funktion generierten Werte
if i
ausgewertet wird . Daher wird das Listenverständnis wie folgt bewertet:False
0
True
range()
quelle
Das spezifische Problem wurde bereits in früheren Antworten gelöst, daher werde ich auf die allgemeine Idee eingehen, Bedingungen innerhalb des Listenverständnisses zu verwenden.
Hier ist ein Beispiel, das zeigt, wie Bedingungen innerhalb eines Listenverständnisses geschrieben werden können:
Beachten Sie, dass im ersten Listenverständnis für
X_non_str
die Reihenfolge lautet:und im letzten Listenverständnis für
X_str_changed
lautet die Reihenfolge:Es fällt mir immer schwer, mich daran zu erinnern, dass expresseion1 vor if stehen muss und expression2 nach else sein muss . Mein Kopf möchte, dass beide entweder vorher oder nachher sind.
Ich denke, es ist so gestaltet, weil es der normalen Sprache ähnelt, zB "Ich möchte drinnen bleiben, wenn es regnet, sonst möchte ich nach draußen gehen".
Im Klartext können die beiden oben genannten Arten von Listenverständnissen wie folgt angegeben werden:
Mit nur
if
:und mit
if/else
quelle
Die anderen Lösungen eignen sich hervorragend für ein Single
if
/else
Konstrukt. Ternäre Aussagen innerhalb des Listenverständnisses sind jedoch wohl schwer zu lesen.Die Verwendung einer Funktion verbessert die Lesbarkeit, aber eine solche Lösung ist in einem Workflow, in dem das Mapping eine Eingabe ist, schwierig zu erweitern oder anzupassen. Ein Wörterbuch kann diese Bedenken lindern:
quelle
Es hat damit zu tun, wie das Listenverständnis durchgeführt wird.
Beachten Sie Folgendes:
Ist äquivalent zu:
Wo das
expression
in einem etwas anderen Format ist (denken Sie daran, das Thema und die Verbreihenfolge in einem Satz zu wechseln).Daher macht Ihr Code
[x+1 for x in l if x >= 45]
Folgendes:Dieser Code
[x+1 if x >= 45 else x+5 for x in l]
führt dies jedoch aus (nach dem Neuanordnen desexpression
):quelle
Es besteht keine Notwendigkeit für ternäre wenn / dann / sonst. Meiner Meinung nach erfordert Ihre Frage diese Antwort:
quelle
Es scheint am besten, zuerst alle möglichen Formen zu verallgemeinern, anstatt spezifische Antworten auf Fragen zu geben. Andernfalls weiß der Leser nicht, wie die Antwort ermittelt wurde. Hier sind einige verallgemeinerte Formulare, die ich mir ausgedacht habe, bevor ich Kopfschmerzen bekam, als ich versuchte zu entscheiden, ob im letzten Formular eine letzte else-Klausel verwendet werden könnte.
Der Wert von
item
muss in keiner der Bedingungsklauseln verwendet werden. Aconditional3
kann als Schalter verwendet werden, um der Ausgabeliste einen Wert hinzuzufügen oder nicht.So erstellen Sie beispielsweise eine neue Liste, in der leere Zeichenfolgen oder Leerzeichen aus der ursprünglichen Liste der Zeichenfolgen entfernt werden:
quelle
this if condition else that
oder ein normaler Ausdruck ist zulässig. Nichtvalue = this if condition
(was mit erreicht werden kannvalue = this if condition else None
)Sie können bedingte Logik in einem Verständnis kombinieren:
quelle
(venv) $ python list_comp.py
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]
Also für dich:
row = [('', unicode(x.strip()))[x is not None] for x in row]
quelle