2011-02-05 7 views
2

J'essaie de vérifier si une liste n'a pas de membre comme opérateur booléen ET, OU, NON.Comment utiliser: pas dans

J'utilise:

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

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

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

Merci, Cindy

+5

Pourquoi utilisez-vous 'while' au lieu de' if'? Et n'utilisez pas 'list' comme nom de variable. –

Répondre

3

and ing cordes ne fait pas ce que vous pensez qu'il ne - utilisez pas pour vérifier si l'une des chaînes sont dans la liste:

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

Aussi, si vous voulez une simple vérification, un if peut-être mieux qu'un while ...

+0

Il est à noter que ceci pourrait parcourir trois fois la liste des mots-clés (une fois pour chaque mot recherché). Dans la plupart des cas, ce n'est probablement pas un problème, mais il est bon de garder à l'esprit si list_of_words devient grand. – pafcu

+0

@pafcu Trois balayages sont effectués uniquement si le premier mot ET et le deuxième mot OU ne sont pas dans la liste des mots. Dans d'autres cas, 1 ou 2 balayages seront suffisants. Personnellement, je trouve plus clair si le mot «mot» n'est pas utilisé pour itérer dans ['AND', 'OR', 'NOT']. Je préfère lire tout (andornot dans list_of_words pour andornot dans ('AND', 'OR', 'NOT')). – eyquem

0

dans votre cas, ('AND' and 'OR' and 'NOT') est évaluée à "NOT", qui peut ou non être en y notre liste ...

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

il n'évalue pas à vrai, il évalue à «NON», un point mineur! –

+0

Gaa ... Trop de commutation entre les langues. Merci d'avoir fait remarquer cela. – gahooa

2

L'expression ('AND' and 'OR' and 'NOT') est évaluée à 'NOT', de sorte que vous testez si la liste n'a pas ou non.

1
while not any(x in ('AND','OR','NOT') for x in list) 

EDIT:

merci pour les upvotes, mais la solution de etarion est mieux car il teste si les mots ET, OU, NON sont dans la liste, c'est-à-dire 3 tests.

Mine effectue autant de tests que de mots dans la liste.

EDIT2:

Il y a également

while not ('AND' in list,'OR' in list,'NOT' in list)==(False,False,False) 
+0

Chacun des 3 tests dans la solution d'entarions examine chaque item de la liste, donc il prend aussi les tests '3 * len (lst)'. Votre solution semble n fois à 3 éléments, donc elle fait des tests 'len (lst) * 3'. Mais j'aime mieux cela car il effectue la même chose quel que soit le '('AND', 'OR', 'NOT')' dans la liste, alors que la réponse d'entarions fonctionne mieux si 'AND' est dans la liste et pire si c'est "NON". Non, tout cela fait une grande différence ... –

+0

Btw, votre edit2 fonctionne le moins bien, car il fait toujours tous les tests 3n même si une correspondance a déjà été trouvée. –

+0

@ Jochen Ritzel Sur Edit2, vous avez raison. Pour Edit1, c'est en fait indécidable: ma solution est meilleure si l'un des 3 est au début de la liste, et pire s'il y en a un seul à la fin de la liste. Tout dépend de la structure de la liste. Il y a un avantage dans la solution d'etarion: en fonction de ce qu'il sait sur la liste, il peut choisir d'utiliser w ('AND', 'OR', 'NOT) ou w (' OU ',' NOT ',' ET ') selon la nature de la liste; alors que dans le mien, il n'est pas utile de changer l'ordre dans ('AND', 'OR', 'NOT'). Mais ma solution semble mentalement plus claire pour moi, je ne sais pas pourquoi – eyquem

1

L'expression 'AND' and 'OR' and 'NOT' évalue toujours 'NOT', de sorte que vous faites efficacement

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

Vous pouvez vérifier séparément pour tous les

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

ou l'utilisation de jeux

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

Y at-il un "non" manquant dans l'exemple d'intersection? – DSM

+0

@DSM: Merci :) –

0

Si je comprends bien la question que vous cherchez 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

Ce n'est pas comment cela fonctionne.

Ce bit ('AND' and 'OR' and 'NOT') est évalué comme 'NOT'.Donc, votre code est équivalent à ::

sans « NON » dans la liste: print 'Aucun opérateur booléen

Vous pouvez essayer ceci:

sans set (« ET » et « OU »et 'NON'.) union (liste): print 'Aucun opérateur booléen

+0

Cela ne fonctionnera pas: set ('AND' et 'OR' et 'NOT') est mis (['N', 'O', 'T']), l'union de cette avec la liste est non vide, donc c'est vrai, pas vrai est faux, donc il ne sera jamais exécuté. – DSM

4

L'utilisation sets sera extrêmement rapide si vous avez un volume de données

Si vous souhaitez 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

Questions connexes