2017-09-20 1 views
4

j'aimerais vérifier si une chaîne contient un élément dans une liste:Vérifiez si un élément de liste existe dans une chaîne

l = ['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M'] 

s = 'YTG' 

La première solution est la suivante:

for i in l: 
    if i in s: 
     print i 

Cela semble inefficace bien que. J'ai essayé le code suivant mais il me donne le dernier élément de la liste 'M' au lieu de 'Y':

if any(i in s for i in l): 
    print i 

Je me demandais quel est le problème ici?

Merci!

+4

'any()' vous donne juste une valeur vraie ou fausse. 'i' n'existera pas après l'expression du générateur, donc si vous avez encore' i', c'est une variable * différente. –

+1

Veuillez poster votre sortie désirée. – Ajax1234

Répondre

8

any() produit True ou False, et les variables d'expression du générateur sont pas disponibles en dehors de l'expression:

>>> l = ['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M'] 
>>> s = 'YTG' 
>>> any(i in s for i in l) 
True 
>>> i 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'i' is not defined 

Utilisez une compréhension de la liste à la liste toutes les lettres correspondant à:

matching = [i for i in l if i in s] 
if matching: 
    print matching 

Ce conserve la commande au l; Si la commande dans matching n'a pas d'importance, vous pouvez simplement utiliser des intersections définies. Je ferais l un ensemble ici:

l = set(['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M']) # Python 3 can use {...} 
matching = l.intersection(s) 
if matching: 
    print matching 

En faisant l l'ensemble, Python peut itérer sur la chaîne s plus courte.

1

any vous dira si la condition est True ou False, sans donner plus de détails.

Pour calculer les lettres communes réelles, il suffit de créer un set et effectuer intersection:

l = ['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M'] 

s = set('YTG') 
print(s.intersection(l)) 

qui donne {'Y'}.

1

Une doublure:

set(list(s)).intersection(set(l))

{'Y'}

Comme par @Martijn Pieters ♦ Commentaire simplement:

set(s).intersection(l) fera l'affaire, comme le montre @ Jean-François Fabre réponse

+1

Vous pouvez supprimer l'appel 'list()' et le second appel 'set()', ils ne font qu'aggraver le travail au profit de 0. –

+0

En outre, l'OP utilise Python 2; la sortie serait 'set (['Y'])'. –