Hier finden Sie die passenden Wörter in eine Liste und einen string
Ich bin ein wenig code schreiben, in Python und ich möchte überprüfen, ob eine Liste von Wörtern ist, die in einem langen string. Ich weiß, ich könnte Durchlaufen Sie mehrere Male, und das ist vielleicht das gleiche, aber ich wollte den tp sehen, wenn es ist ein schneller Weg, es zu tun. Was ich derzeit mache, ist diese:
all_text = 'some rather long string'
if "motorcycle" in all_text or 'bike' in all_text or 'cycle' in all_text or 'dirtbike' in all_text:
print 'found one of em'
aber, was ich tun will, ist dies:
keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike']
if item in keyword_list in all_text:
print 'found one of em'
Gibt es trotzdem, dies zu tun, effizient? Ich merke, ich könnte tun:
keyword_list = ['motorcycle', 'bike', 'cycle', 'dirtbike']
for item in keyword_list:
if item in all_text:
print 'found one of em'
Aber es scheint, wie es wäre ein besserer Weg, sobald die keyword-Liste wird lang.
InformationsquelleAutor clifgray | 2013-02-08
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie immer noch, um Sie alle zu überprüfen, mindestens bis eine gefunden wird, werden in den text, aber kann es sein, prägnant:
keyword_list
in eineset
Es wäre effizienter, überprüfen Sie den anderen Weg:
any(word in keywords for word in text)
text ist nicht eine Liste von Wörtern, die Sie haben, um es zu teilen ersten.
bekommt den job getan und ein bisschen schneller zu werden. danke!
InformationsquelleAutor Pavel Anossov
Eine Möglichkeit wäre der Aufbau einer Präfix-Baum aus der keyword-Liste.
Dann können Sie eine Iteration durch die lange Zeichenfolge Zeichen pro Zeichen.
Bei jeder iteration, die Sie versuchen zu finden, in dem Präfix-Baum das Präfix in die große Zeichenkette beginnend an der aktuellen position. Dieser Vorgang dauert
O(log k)
Zeit, in der die Schlüsselwort-Liste ist der Größe k (sofern der Präfix-Baum ist balanciert).Wenn die lange Zeichenkette der Länge n, dann ist die Berechnung der Komplexität ist nur
O(n log k)
, die ist viel besser als die naiveO(n k)
wenn k groß ist.InformationsquelleAutor Petar Ivanov
Wie über dieses.
set
. Jedoch, keine Notwendigkeit, schneiden Sie die gesamte Menge zu finden truthy Wert... Verwendenany
und generator gegen einkeyword_list
statt... Auch, aus deinem Beispiel, würde ich schreiben, es alsset(keyword_list).intersection(all_text.split())
- dies vermeidet unnötige KonvertierungDanke für die info 🙂
InformationsquelleAutor Rakesh
ya brauchen, um all_text eine variable oder es wird nicht funktionieren,
InformationsquelleAutor Luka Styles
Verwendung regulärer Ausdruck ist wohl der schnelle Weg.
zurückkehren wird, alle Spiele des ausgewählten Wörter.
|cycle|
passen auf Fahrrad, Dreirad, Einrad, etc. Das ist eindeutig nicht der original Autor ist Absicht. Sie verbessern könnten, diese regex zu verwenden, Wort-Grenze Notationen und so, aber dann besteht das Risiko, dass es nicht mehr lesbar ist. Der ursprüngliche Autor hat nicht angegeben, wie Sie definiert "effizient" (kleinste Menge an code? Schnellste Laufzeit? kleinste Speicher verwenden?), aber regexes Risiko als sehr ineffizient CPU-und RAM-Speicher. Nicht das Besondere regex, sondern als eine Allgemeine Klasse von Lösungen, Sie müssen vorgeschlagen werden, mit Sorgfalt.InformationsquelleAutor Shawn