Comment puis-je faire ce qui suit en Python?
row = [unicode(x.strip()) for x in row if x is not None else '']
Essentiellement:
- remplacer tous les Nones par des chaînes vides, puis
- exécuter une fonction.
Comment puis-je faire ce qui suit en Python?
row = [unicode(x.strip()) for x in row if x is not None else '']
Essentiellement:
Réponses:
Vous pouvez totalement faire ça. C'est juste un problème de commande:
En général,
Et, pour les listes de compréhension avec
if
conditions uniquement,Notez que cela utilise en fait une construction de langage différente, une expression conditionnelle , qui elle-même ne fait pas partie de la syntaxe de compréhension , tandis que l'
if
afterfor…in
fait partie des compréhensions de liste et sert à filtrer les éléments de la source itérable.Les expressions conditionnelles peuvent être utilisées dans toutes sortes de situations où vous souhaitez choisir entre deux valeurs d'expression en fonction d'une condition. Cela fait la même chose que l' opérateur ternaire
?:
qui existe dans d'autres langues . Par exemple:la source
l = [ 2, 3, 4, 5]
alors[x if x % 2 == 0 for x in l]
donne moi une erreur alors que ça[x if x % 2 == 0 else 200 for x in l]
marche. Oui je sais que pour le filtrer je devrais l'écrire[ x for x in l if x % 2 == 0]
. Désolé pour la peine. Merci pour votre réponse.Une manière:
Bien que vous ayez alors:
Ou vous pouvez utiliser un lambda en ligne.
la source
if
expression ou du code dans son ou leelse
bloc d'instructions s. La réponse acceptée est meilleure pour les cas simples.Voici un autre exemple illustratif:
Il exploite le fait qu'il
if i
évalueFalse
pour0
etTrue
pour toutes les autres valeurs générées par la fonctionrange()
. Par conséquent, la compréhension de la liste s'évalue comme suit:la source
Le problème spécifique a déjà été résolu dans les réponses précédentes, je vais donc aborder l'idée générale d'utiliser des conditions dans les listes de compréhension.
Voici un exemple qui montre comment les conditions peuvent être écrites dans une compréhension de liste:
Notez que dans la première liste de compréhension pour
X_non_str
, l'ordre est:et dans la dernière liste de compréhension pour
X_str_changed
, l'ordre est:J'ai toujours du mal à me rappeler que l' expression1 doit être antérieure à if et l' expression2 doit être postérieure à autre chose . Ma tête veut que les deux soient avant ou après.
Je suppose qu'il est conçu comme ça parce qu'il ressemble à un langage normal, par exemple "Je veux rester à l'intérieur s'il pleut, sinon je veux sortir"
En anglais simple, les deux types de compréhension de liste mentionnés ci-dessus pourraient être énoncés comme suit:
Avec seulement
if
:et avec
if/else
la source
Les autres solutions sont idéales pour un single
if
/else
construct. Cependant, les déclarations ternaires dans les listes de compréhension sont sans doute difficiles à lire.L'utilisation d'une fonction facilite la lisibilité, mais une telle solution est difficile à étendre ou à adapter dans un flux de travail où le mappage est une entrée. Un dictionnaire peut atténuer ces problèmes:
la source
Cela a à voir avec la façon dont la compréhension de la liste est effectuée.
Gardez à l'esprit les points suivants:
Est équivalent à:
Où le
expression
est dans un format légèrement différent (pensez à changer l'ordre du sujet et du verbe dans une phrase).Par conséquent, votre code
[x+1 for x in l if x >= 45]
fait ceci:Cependant, ce code
[x+1 if x >= 45 else x+5 for x in l]
fait cela (après avoir réorganisé leexpression
):la source
Il n'y a aucun besoin de ternaire si / alors / sinon. À mon avis, votre question appelle cette réponse:
la source
Il semble préférable de généraliser d'abord toutes les formes possibles plutôt que de donner des réponses spécifiques aux questions. Sinon, le lecteur ne saura pas comment la réponse a été déterminée. Voici quelques formulaires généralisés que j'ai imaginés avant d'avoir mal à la tête en essayant de décider si une clause else finale pourrait être utilisée dans le dernier formulaire.
La valeur de
item
n'a pas besoin d'être utilisée dans aucune des clauses conditionnelles. Aconditional3
peut être utilisé comme commutateur pour ajouter ou non une valeur à la liste de sortie.Par exemple, pour créer une nouvelle liste qui élimine les chaînes vides ou les chaînes d'espaces de la liste de chaînes d'origine:
la source
this if condition else that
ou une expression normale est autorisée. Nonvalue = this if condition
(ce qui peut être réalisé avecvalue = this if condition else None
)Vous pouvez combiner la logique conditionnelle dans une compréhension:
la source
(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]
Alors pour vous:
row = [('', unicode(x.strip()))[x is not None] for x in row]
la source