2017-02-07 2 views
1

Ich mache einige Mustervergleiche und möchte überprüfen, ob ein Teil einer Zeichenfolge in einer Liste von Zeichenfolgen angezeigt wird. mache ich etwas wie folgt aus:Treffer zurückgeben, wenn übereinstimmen

if any(x in line for x in aListOfValues):

Ist es möglich, den Wert von x zusätzlich zu der Linie zurückkehren?

+0

Mögliche Duplikat [Was ist der beste Weg, um das erste Element aus einem iterable zu erhalten eine Bedingung?] (http://stackoverflow.com/questions/2361426/what-ist-best-way-to-get-the-first-item-from-an-iterable-matching-a-condition) –

Antwort

3

Sie könnten next() verwenden, um die nächste Übereinstimmung von einem ähnlichen Generator mit einem False Standard abzurufen. Beachten Sie, dass dies nur die erste Übereinstimmung liefert, offenbar nicht jedes Spiel.

match = next((x for x in aListOfValues if x in line), False) 

Alternativ kann eine extrem einfache Lösung könnte darin bestehen, können Sie die aktuelle Anweisung in eine Schleife dekonstruieren und ein Tupel zurückgeben x sowie die Zeile enthält.

def find(line, aListOfValues): 
    for x in aListOfValues: 
     if x in line: 
      return x, line 
    return False, line 
+1

Ich würde auch hinzufügen, dass 'next' ** nur ** das erste Element zurückgibt, für das die Bedingung True ist und nicht alle im Falle von multiple. zumindest nicht so, wie es hier verwendet wird. –

+0

@ Ev.Kounis Ich interpretierte das irgendwie aus der OP-Frage, aber sicher, ich machte das klarer. – miradulo

+1

Danke, stecken Sie mit Ihrer "Match" -Lösung fest. – Conor

1

Sie könnten es tun, indem Sie das erste Element raubend kehrte am Spiel next verwenden. Beachten Sie, dass Sie gegen StopIteration Ausnahme zu schützen, wenn Sie nicht sicher sind Sie, ein Muster finden werden:

try: 
    print (next(x for x in aListOfValues if x in line)) 
except StopIteration: 
    print("Not found") 
0
aListOfValues = ["hello", "hallo"] 
line = "hello world" 
#classic one 
res = [x for x in aListOfValues if x in line] 
print res 
>>['hello'] 

# back to your case 
if any(x in line for x in aListOfValues): 
    print set(aListOfValues) & set(line.split()) 
>> set(['hello']) 

match = set(aListOfValues) & set(line.split()) 
if match: #replace any query 
    print match 
>> set(['hello']) 
Verwandte Themen