2010-11-23 4 views
467

Comment puis-je faire ce qui suit en Python?si/sinon dans la compréhension de la liste de Python?

row = [unicode(x.strip()) for x in row if x is not None else ''] 

essentiellement:

  1. remplacer tous les nones avec des chaînes vides, puis
  2. exécuter une fonction.
+3

double possible de [? Est-il possible d'utiliser « autre » dans une compréhension de la liste python] (http://stackoverflow.com/questions/2951701/is-it- possible-d'utiliser-autrement-dans-une-python-list-comprehension) –

Répondre

734

Vous pouvez tout à fait le faire, il est juste un problème de commande:

[ unicode(x.strip()) if x is not None else '' for x in row ] 

Notez que cela utilise en fait une construction de langue, un conditional expression, qui est lui-même ne fait pas partie du comprehension syntax, tandis que le if après le for…in fait partie de la compréhension de la liste et utilisé filtre é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 basées sur certaines conditions. Cela fait la même chose que le ternary operator ?: that exists in other languages. Par exemple:

value = 123 
print(value, 'is', 'even' if value % 2 == 0 else 'odd') 
+86

Notez que le if/else ici est maintenant la syntaxe "opérateur ternaire" et non la syntaxe de compréhension de liste. –

+1

Étant donné la question précédente de OP, la remarque de @ Adam est très importante! – delnan

+7

C'est pourquoi je préfère mettre l'opérateur ternaire entre parenthèses, cela rend plus clair que c'est juste une expression normale, pas une compréhension. –

30

Une façon:

def change(f): 
    if f is None: 
     return unicode(f.strip()) 
    else: 
     return '' 

row = [change(x) for x in row] 

Bien que vous avez:

row = map(change, row) 

Ou vous pouvez utiliser une ligne lambda.

+8

Il s'agit également d'une bonne technique (peut-être seulement) à utiliser lorsque vous devez gérer des exceptions possibles de l'expression ou du code 'if' dans son bloc d'instruction' else's. La réponse acceptée est meilleure pour les cas simples. – martineau

+1

Ceci est beaucoup plus facile à lire que de l'utiliser dans une compréhension de liste. –

25

Voici un autre exemple illustratif:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!") 
Ha, ha, ha! 

Il exploite le fait que if i est évaluée à False pour 0 et True pour toutes les autres valeurs générées par la fonction range(). Par conséquent, la compréhension de la liste évalue comme suit:

>>> ["ha" if i else "Ha" for i in range(3)] 
['Ha', 'ha', 'ha'] 
Questions connexes