0
votes

L'opérateur "Pas dans" ne prend pas l'opérateur "ou"

J'ai ce petit code python, il ne fonctionne pas comme ci-dessous.

while True:
    activity = input("What would you like to do today? ")
    a="cinema"
    b="tennis"
    if (a not in activity.lower()) or (b not in activity.lower()):
        print(f"Instead of {activity} I want to go to the cinema")
    else:
        print("Sure Let's do that!!")

Cependant, lorsque j'extrait le or b , cela fonctionne bien

while True:
    activity = input("What would you like to do today? ")
    a="cinema"
    b="tennis"
    if a  not in activity.lower():
        print(f"Instead of {activity} I want to go to the cinema")
    else:
        print("Sure Let's do that!!")

La question est de savoir pourquoi a or b ne fonctionne pas lorsqu'il est utilisé avec not in travail?

EDIT: J'ai fait la modification ci-dessous, mais ne fonctionne toujours pas.

while True:
    activity = input("What would you like to do today? ")
    a="cinema"
    b="tennis"
    if a or b not in activity.lower():
        print(f"Instead of {activity} I want to go to the cinema")
    else:
        print("Sure Let's do that!!")

Le lien ci-dessous est également suggéré pour cet article. C'est aussi très bien. Alors je le partage pour ceux qui en bénéficieront

Comment tester plusieurs variables par rapport à une valeur?


8 commentaires

Vous devez l'écrire entièrement comme "a pas dans activity.lower () ou b pas dans activity.lower ()".


or ne fonctionne jamais de cette façon. Python! = Anglais


Certes, créer not in tant qu'opérateur séparé par rapport à not (x in y) pourrait le faire paraître ...


@ juanpa.arrivillaga je comprends bien maintenant. Ce que nous devons penser est vrai ou faux dans ce cas. J'espère que j'ai raison?


Très lié: stackoverflow.com/questions/47007680/...


@ juanpa.arrivillaga merci les réponses sont incroyables au lien.


Aussi, la section pertinente de la documentation: docs.python.org/3/library/stdtypes.html#truth-value-testing


"EDIT: j'ai fait la modification ci-dessous, mais ne fonctionne toujours pas." La raison pour laquelle celui-ci ne fonctionne pas est une simple erreur logique. Veuillez consulter en.wikipedia.org/wiki/De_Morgan%27s_laws


4 Réponses :


1
votes

Regardez la valeur de a or b :

>>> a = "cinema"
>>> b = "tennis"
>>> a or b
'cinema'

L'opérateur "ou" n'a pas de signification différente lorsqu'il fait partie d'un in .


1 commentaires

Bien que cela soit vrai or fonctionne de cette façon, la priorité des opérateurs n'est pas ce à quoi vous vous attendez. Par exemple, si vous ajoutez c = {'cinema'} , alors a or b not in c donne 'cinema' (le même que a or (b not in c) , alors que (a or b) not in c aboutit à False .



1
votes

Cela ne fonctionnera pas, cela ne fera pas ce que vous pensez:

if activity.strip().lower() not in (a, b):

Ce qui précède est équivalent à:

if (a) or (b not in activity.lower()):

Ce qui signifie quelque chose de différent, et sera True tant que a n'est pas nul ou vide. Outre que vous avez la comparaison à l'envers, la syntaxe correcte que vous recherchez est:

if a or b not in activity.lower():


9 commentaires

La syntaxe que vous avez donnée ne fonctionne pas non plus. Je suppose que ces nombreux opérateurs ne fonctionnent pas en python.


Mais ta réponse en explique beaucoup


if activity.lower() not in (a,b) : fonctionne aussi, et est moins verbeux.


@MarkTolonen ouais, tu as raison. Je ne savais pas que OP avait la comparaison à l'envers. Merci, j'ai mis à jour ma réponse!


@ ÇağlarYıldız ce n'est pas un problème avec le nombre d'opérateurs :) c'est juste que vous avez eu la comparaison à l'envers. J'ai mis à jour ma réponse.


@MarkTolonen J'ai également mis à jour la question, pouvez-vous dire ce qui ne va pas?


Mmm dans le cas des chaînes in n'agit pas comme un conteneur de caractères, car in vérifie si une chaîne est une sous-chaîne d'une autre


La version que vous aviez à l'origine fonctionnerait pour des choses comme activity = "the cinema" car a in activity.lower() donnera vrai puisqu'il s'agit d'une sous-chaîne, la version que vous avez prise de @MarkTolonen ne fonctionne que lorsque l'entrée est la même.


@ TadhgMcDonald-Jensen ce n'était pas de moi. Voir le 3ème commentaire ci-dessus.



-1
votes

Tout d'abord, il vérifie if (a) or (b not in activity.lower()) Ce n'est pas correct. Ce que vous voulez, c'est quelque chose pour vérifier une chaîne dans une chaîne comme if activty.count(a) == 0 and activty.count(b) == 0 parce que cela vérifie combien de fois a et b apparaissent dans l'activité.


5 commentaires

Merci J'ai beaucoup appris de votre réponse.


Malheureusement, si (a pas en activité.lower ()) ou (b pas en activité.lower ()): -> n'a pas fonctionné


activity est une chaîne et in ne retournera pas True sauf si a est un caractère unique correspondant à un caractère d' activity .


vous devriez essayer if activity.find(a) == -1 and activity.find(b) == -1 parce que cela trouvera une chaîne dans une chaîne


ou vous pouvez l'utiliser if activity.count(a) == 0 and activity.count(b) == 0 il vérifie combien de fois a et b apparaissent à l'intérieur de l'activité



0
votes

a or b not in c est traité comme (a) or (b not in c) . a est considéré comme vrai s'il est non nul ou non vide. Donc, si a est une chaîne non vide, a or b not in c sera toujours True.

c not in (a,b) est ce que vous voulez. Il teste que la valeur de c n'est pas membre du conteneur, équivalent à c != a and c != b

Dans votre édition, l' activity est une chaîne et in in strings fonctionne plus comme contient . Donc ce code:

'tennis' not in ('cinema','tennis') # False

est équivalent à:

True or True  # result True

lequel est:

'cinema' not in 'run' or 'tennis' not in 'run'

Notez que 'tennis' in 'thetennisball' est True parce que 'thetennisball' contient le mot 'tennis' . Si vous recherchez des correspondances exactes, ce n'est pas ce que vous voulez.

Un autre problème est l'utilisation de or . Lorsque vous testez qu'une chose n'est pas une chose ou une autre, l'une d'elles sera toujours fausse, car une chose ne peut pas être deux choses à la fois. Vous n'obtiendrez jamais un vrai pour x != 2 or x != 1 par exemple. Si x vaut 1, ce n'est pas 2 et si x vaut 2, ce n'est pas 1. Utilisez and place.

Pour tester les mots dans une liste exacte de mots, utilisez une liste (ou un autre conteneur comme tuple):

activity = "run"
a="cinema"
b="tennis"
if (a not in activity.lower()) or (b not in activity.lower()):


2 commentaires

La seule partie que je ne comprends pas concerne ma modification. Vous dites tennis = "courir" mais dans la partie "tennis"! = "R" vous prétendez qu'il va chercher chaque lettre. Cela renvoie sûrement faux. Ne recherche-t-il pas comme un conteneur entier?


@ ÇağlarYıldız En fait, je me suis mal exprimé. string in string fonctionne différemment. 'def' in 'abcdefghi' renvoie True. in for strings ressemble plus à contient . Je vais modifier la réponse pour corriger cela, mais toujours pas ce que vous voulez.