web-dev-qa-db-fra.com

Comment utiliser: en dehors

J'essaye de vérifier si une liste n'a aucun membre comme opérateur booléen AND, OR, NOT.

J'utilise:

while ('AND' and 'OR' and 'NOT') not in list:
  print 'No boolean operator'

Cependant, lorsque mon entrée est: a1 c2 OR c3 AND, il affiche "Aucun opérateur booléen", ce qui signifie que cette liste n'est considérée comme aucun opérateur booléen en utilisant la phrase de boucle ci-dessus.

J'espère que quelqu'un peut aider à corriger.

Merci, Cindy

9
CindyRabbit

L'utilisation de sets criera rapidement si vous avez un volume de données

Si vous êtes prêt à utiliser des ensembles, vous avez la méthode isdisjoint() qui vérifiera si l'intersection entre votre liste d'opérateurs et votre autre liste est vide.

MyOper = set(['AND', 'OR', 'NOT'])
MyList = set(['c1', 'c2', 'NOT', 'c3'])

while not MyList.isdisjoint(MyOper):
    print "No boolean Operator"

http://docs.python.org/library/stdtypes.html#set.isdisjoint

7
gahooa

anding strings ne fait pas ce que vous pensez faire - utilisez any pour vérifier si l'une des chaînes se trouve dans la liste:

while not any(Word in list_of_words for Word in ['AND', 'OR', 'NOT']):
    print 'No boolean'

De plus, si vous voulez une vérification simple, un if pourrait être mieux adapté qu'un while...

3
etarion

L'expression 'AND' and 'OR' and 'NOT' vaut toujours 'NOT', donc vous faites effectivement

while 'NOT' not in some_list:
    print 'No boolean operator'

Vous pouvez soit vérifier séparément pour chacun d'eux

while ('AND' not in some_list and 
       'OR' not in some_list and 
       'NOT' not in some_list):
    # whatever

ou utilisez des ensembles

s = set(["AND", "OR", "NOT"])
while not s.intersection(some_list):
    # whatever
3
Sven Marnach

L'expression ('AND' and 'OR' and 'NOT') évalue à 'NOT', donc vous testez si la liste n'a PAS ou non.

2
Ned Batchelder
while not any( x in ('AND','OR','NOT') for x in list)

ÉDITER:

merci pour les upvotes, mais la solution d'etarion est meilleure car elle teste si les mots AND, OR, NOT sont dans la liste, soit 3 tests.

Le mien fait autant de tests qu'il y a de mots dans la liste.

EDIT2:

Il y a aussi

while not ('AND' in list,'OR' in list,'NOT' in list)==(False,False,False)
1
eyquem

Dans ton cas, ('AND' and 'OR' and 'NOT') évalue à "NOT", qui peut ou non être dans votre liste ...

while 'AND' not in MyList and 'OR' not in MyList and 'NOT' not in MyList:
    print 'No Boolean Operator'
0
gahooa

Si je comprends bien la question, vous recherchez quelque chose comme ceci:

>>> s = "a1 c2 OR c3 AND"
>>> boolops = ["AND", "OR", "NOT"]
>>> if not any(boolop in s for boolop in boolops):
...     print "no boolean operator"
... 
>>> s = "test"
>>> if not any(boolop in s for boolop in boolops):
...     print "no boolean operator"
... 
no boolean operator
>>> 
0
ChristopheD

Ce n'est pas comme ça que ça marche.

Ce bit ('AND' and 'OR' and 'NOT') sera évalué comme 'NOT'. Donc votre code équivaut à ::

sans 'NOT' dans la liste: print 'No boolean operator'

Vous pouvez essayer ceci:

while not set ('AND' and 'OR' and 'NOT'). union (list): print 'Pas d'opérateur booléen'

0
wisty