2017-09-20 1 views
4

Ich möchte überprüfen, ob eine Zeichenfolge ein Element aus einer Liste enthält:Überprüfen Sie, ob ein Listenelement in einem String existiert

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

s = 'YTG' 

Die erste Lösung ist:

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

Dies scheint ineffizient obwohl. Ich habe versucht, den folgenden Code, aber es gibt mir das letzte Element der Liste 'M' statt 'Y':

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

Ich frage mich, was ist das Problem hier?

Danke!

+4

'any()' gibt Ihnen nur einen wahren oder falschen Wert. 'i' wird nach dem Generatorausdruck nicht existieren, wenn Sie also noch' i' haben, ist es eine * andere Variable *. –

+1

Bitte senden Sie Ihre gewünschte Ausgabe. – Ajax1234

Antwort

8

any() produziert True oder False, und der Generator Ausdruck Variablen sind nicht verfügbar außerhalb des Ausdrucks:

>>> 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 

Verwenden Sie eine Liste Verständnis alle passenden Buchstaben zur Liste:

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

That bewahrt die Bestellung in l; Wenn die Reihenfolge in matching spielt keine Rolle, könnten Sie einfach setzen Schnittpunkte. Ich würde l einen Satz macht hier:

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

Indem l den Satz kann Python über den kürzeren s String iterieren.

1

any wird Ihnen sagen, ob die Bedingung True oder False ist, ohne weitere Details zu geben.

die tatsächlichen gemeinsamen Buchstaben zu berechnen, um nur set erstellen und führen Kreuzung:

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

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

die {'Y'} ergibt.

1

Motto:

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

{'Y'}

Per @Martijn Pieters ♦ Kommentar einfach:

set(s).intersection(l) den Trick, wie

in @ Jean-François Fabre Antwort gezeigt
+1

Sie können den 'list()' Aufruf und den zweiten 'set()' Aufruf löschen, sie verursachen nur mehr Arbeit bei 0 Nutzen. –

+0

Auch das OP verwendet Python 2; die Ausgabe wäre 'set (['Y'])' '. –

Verwandte Themen