2017-01-18 2 views
2

Ich arbeite in Python, mit any() wie so nach einer Übereinstimmung zwischen einem Array String[] und einem Kommentar von Reddit API gezogen.Wie finden Sie, was in jedem() mit Python übereinstimmt?

Derzeit ist ich es, wie dies zu tun:

isMatch = any(string in comment.body for string in myStringArray) 

Aber es wäre auch nützlich sein, weiß nicht nur, wenn isMatch wahr ist, aber welches Element von myStringArray es ist, dass ein Spiel hatte. Gibt es eine Möglichkeit, dies mit meinem derzeitigen Ansatz zu tun, oder muss ich einen anderen Weg finden, nach einem Spiel zu suchen?

+4

einfach entfernen 'any' und führe die Überprüfung mit expliziter 'for'-Schleife durch. Ich sehe hier kein Problem –

Antwort

1

Sie next mit default=False auf einem bedingten Generator Ausdruck verwenden:

next((string for string in myStringArray if string in comment.body), default=False) 

Die Standard-zurückgegeben wird, wenn es kein Element, das angepasst (so ist es wie any Rückkehr False), andernfalls wird das erste passende Element zurückgegeben .

Dies entspricht in etwa:

isMatch = False # variable to store the result 
for string in myStringArray: 
    if string in comment.body: 
     isMatch = string 
     break # after the first occurrence stop the for-loop. 

oder wenn Sie isMatch und whatMatched in verschiedenen Variablen haben wollen:

isMatch = False # variable to store the any result 
whatMatched = '' # variable to store the first match 
for string in myStringArray: 
    if string in comment.body: 
     isMatch = True 
     whatMatched = string 
     break # after the first occurrence stop the for-loop. 
+0

Ist es wirklich eine gute Idee, * entweder * a bool oder die übereinstimmende Zeichenfolge in der gleichen Variablen zu speichern? Dies scheint dynamische Typen viel zu weit zu führen. – brianpck

+1

'any' kann sofort verstanden werden, indem man es betrachtet. Eine 'for'-Schleife wäre nicht viel schlechter. Ich habe mir das eine Minute lang angeschaut und kann mich immer noch nicht davon überzeugen, dass es funktioniert; das macht es zu einer schlechten Lösung. –

+0

@MarkRansom Ich habe eine Version ohne 'next' hinzugefügt, die äquivalent sein sollte. Nur für den Fall, dass es hilft zu verstehen, was passiert. :) – MSeifert

0

ich mit der Bemerkung darüber einig, dass eine explizite Schleife klarste sein würde. Sie könnte Ihre ursprüngliche frisieren wie so:

isMatch = any(string in comment.body and remember(string) for string in myStringArray) 
            ^^^^^^^^^^^^^^^^^^^^^ 

wo:

def remember(x): 
    global memory 
    memory = x 
    return True 

Dann wird die globale memory die gefundenen String enthalten, wenn isMatchTrue ist, oder behalten unabhängig von Wert (falls vorhanden) es ursprünglich hatte wenn isMatchFalse ist.

+3

Ich hoffe, das ist humorvoll für das Problem der OP versucht zu lösen :) – brianpck

+0

Globals sind böse.Wenn Sie diese Technik wirklich verwenden möchten, erstellen Sie ein Klassenobjekt mit einem Mitglied, um sich an die Übereinstimmung zu erinnern. –

2

Es ist keine gute Idee, eine Variable zu verwenden, um zwei verschiedene Arten von Informationen: ob ein String Matches (a bool) und was dass String (a string).

Sie müssen wirklich nur die zweite Information: während es kreative Möglichkeiten, dies in einer Erklärung zu tun, wie in der obigen Antwort, es macht wirklich Sinn, eine for Schleife zu verwenden:

match = '' 
for string in myStringArray: 
    if string in comment.body: 
     match = string 
     break 

if match: 
    pass # do stuff 
+0

Setzen Sie das in eine Funktion und es ist perfekt. –

Verwandte Themen