2017-05-03 5 views
1

Existe-t-il un raccourci pour écrire une comparaison dans une instruction if si vous faites la même comparaison pour plusieurs valeurs. Juste curieux si quelque chose comme ceci est possible. Merci pour l'aide!raccourci pour et/ou en python if instructions

a =1 
b =1 
c =1 

if a == 1 and b ==1 and c == 1: 
    print('yes') 

# It would be nice if you could do this or something like it. 
if a,b,c == 1: 
    print('this would be easier') 
+4

Est-ce que c'est bien '(a, b, c) == (1,1,2)' ?? – Rafael

Répondre

4

Vous pouvez utiliser all pour and:

# same as: 
# if a == 1 and b == 1 and c == 1: 
if all(x == 1 for x in (a, b, c)): 
    ... 

ou vous pouvez utiliser Enchaînement de l'opérateur:

if a == b == c == 1: 
    ... 

Mais je ne vois pas très bien dans le code réel.


Pour or, vous pouvez utiliser any:

# same as: 
# if a == 1 or b == 1 or c == 1: 
if any(x == 1 for x in (a, b, c)): 
    ... 

Pour autant que je me souvienne, il n'y a pas de truc chaining opérateur à celui-ci si vous pouvait utiliser in:

if 1 in (a, b, c): 
    ... 

Cela a des implications sur le plan des performances (c.-à-d. Qu'il crée un nouveau tuple uniquement pour les comparaisons). Normalement, c'est assez bon marché et ne serait pas perceptible dans quoi que ce soit, mais le plus serré des boucles si.

+0

Evaluera la liste entière mais fonctionnera: 'all ([a == 1, b == 1, c == 1])'. – Elmex80s

+0

'1 dans (a, b, c)' pourrait être plus lent lorsque 'a',' b' et 'c' sont des expressions coûteuses et' a' n'est déjà pas '1', donc' b' et 'c' wouldn Il ne faut pas être évalué. Pour la même raison, je préfère utiliser '1 == a == b == c' pour le cas' and ', c'est-à-dire mettre la "cible" en premier. –

+0

@StefanPochmann - Oui, l'absence de court-circuit est un gros problème s'il y a beaucoup d'éléments dans le tuple (ce qui est peu probable si vous le construisez à partir de rien) ou si 'a',' b' et 'c 'sont des expressions arbitraires (coûteuses) plutôt que de simples recherches de noms ... Selon le libellé de la question, il semble que OP fasse des recherches simples, mais votre point devrait être reconnu pour les autres cas ... – mgilson

1

Quelque chose comme si les valeurs sont hashable:

if set((a, b, c)) == {1}: 
    # All are 1. 

Ou peut-être si toutes les 3 valeurs sont des nombres entiers non négatifs, multiplier tous et voir si le résultat est 1?

if a * b * c == 1: 
    # All are 1. 

La réponse générique est all(..) comme dans la réponse de mgilson.

+2

Vous devez être attention à la multiplication ... C'est intelligent, mais ça ne marche pas toujours. Considérons 'a, b, c = 1, -1, -1' :-) – mgilson

+0

Oh, j'aurais dû dire des nombres non négatifs. Laissez-moi éditer la réponse. – SuperSaiyan

+0

Pourquoi ne pas utiliser '{a, b, c}'? Je sais que vous le savez, vous l'utilisez dans '{1}' ... –