2010-08-18 20 views
9

leider zu entfernen, wenn die Frage ist etwas verwirrend. Das ist ähnlich wie this questionWie Liste der Wörter aus einer Liste von Strings

Ich denke, das ist die obige Frage nahe, was ich will, aber in Clojure.

Es gibt another Frage

ich so etwas wie dieses brauchen aber statt ‚[br]‘ in dieser Frage, gibt es eine Liste von Strings, die gesucht und entfernt werden müssen.

Ich hoffe, ich machte mich klar.

Ich denke, dass dies aufgrund der Tatsache ist, dass Strings in Python unveränderlich sind.

Ich habe eine Liste von Geräuschwörtern, die aus einer Liste von Zeichenfolgen entfernt werden müssen.

Wenn ich das Listenverständnis verwende, suche ich immer wieder die gleiche Zeichenfolge. Also wird nur "von" entfernt und nicht "der". So sieht meine modifizierte Liste wie folgt

places = ['New York', 'the New York City', 'at Moscow' and many more] 

noise_words_list = ['of', 'the', 'in', 'for', 'at'] 

for place in places: 
    stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)] 

Ich möchte wissen, wie zu welchen Fehler ich mache.

+1

Was ist 'place'? – katrielalex

+0

Du machst dich nicht klar; Geben Sie Ihre Frage * hier * an und fügen Sie dann Links zu ähnlichen Fragen mit ähnlichen Antworten hinzu, wenn Sie dies unten für notwendig halten. –

Antwort

9

Hier ist mein Stich. Dies verwendet reguläre Ausdrücke.

import re 
pattern = re.compile("(of|the|in|for|at)\W", re.I) 
phrases = ['of New York', 'of the New York'] 
map(lambda phrase: pattern.sub("", phrase), phrases) # ['New York', 'New York'] 

Sans lambda:

[pattern.sub("", phrase) for phrase in phrases] 

aktualisieren

Fix für den Fehler hingewiesen durch gnibbler (danke!):

pattern = re.compile("\\b(of|the|in|for|at)\\W", re.I) 
phrases = ['of New York', 'of the New York', 'Spain has rain'] 
[pattern.sub("", phrase) for phrase in phrases] # ['New York', 'New York', 'Spain has rain'] 

@prabhu: die obige Änderung vermeidet das Abschneiden des nachfolgenden "in "aus" Spanien ". Um zu überprüfen, laufen beide Versionen der regulären Ausdrücke gegen den Ausdruck "Spanien hat Regen".

+0

Danke. Es funktioniert so. Ich konnte das Konzept von Lambda jetzt besser verstehen, als ich die Möglichkeit hatte, dies umzusetzen. – prabhu

+1

Dies funktioniert nicht richtig für den Ausdruck "Spanien hat Regen". Es ist einfach zu beheben, obwohl –

+0

@ Gnibbler: Danke, dass Sie darauf hingewiesen haben. Ändere meine Antwort entsprechend. –

3
>>> import re 
>>> noise_words_list = ['of', 'the', 'in', 'for', 'at'] 
>>> phrases = ['of New York', 'of the New York'] 
>>> noise_re = re.compile('\\b(%s)\\W'%('|'.join(map(re.escape,noise_words_list))),re.I) 
>>> [noise_re.sub('',p) for p in phrases] 
['New York', 'New York'] 
+0

Wow! Das ist eine wirklich coole Art zu tun, obwohl ich mein Gehirn belastete. :-) – prabhu

+0

Dies scheint nicht jede Instanz von Wörtern zu bekommen. Zum Beispiel wird "New York of" zu "New York of". – Namey

+1

@Namey, du könntest etwas wie "\\ W \\ b (% s) \\ W?" Verwenden. Ohne das OP, das eine umfassende Reihe von Testfällen zur Verfügung stellt, ist es ein bisschen wie ein Schlag-ein-Maulwurf –

1

Da Sie möchten wissen, was Sie falsch machen, diese Zeile:

stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)] 

statt und beginnt dann eine Schleife über Worte. Zuerst prüft es auf "von". Dein Platz (z. B. "von New York") wird überprüft, um zu sehen, ob er mit "von" beginnt. Es wird transformiert (Aufruf zum Ersetzen und Entfernen) und zur Ergebnisliste hinzugefügt. Das Entscheidende hier ist, dass das Ergebnis nie wieder untersucht wird. Für jedes Wort, das Sie im Verständnis durchlaufen, wird ein neues Ergebnis zur Ergebnisliste hinzugefügt. Das nächste Wort ist also "das" und dein Platz ("New York") beginnt nicht mit "dem", also wird kein neues Ergebnis hinzugefügt.

Ich nehme an, das Ergebnis, das Sie schließlich erhalten, ist die Verkettung Ihrer Ortsvariablen. Ein einfacher zu lesen und zu verstehen Verfahren Version wäre (nicht getestet):

results = [] 
for place in places: 
    for word in words: 
     if place.startswith(word): 
      place = place.replace(word, "").strip() 
    results.append(place) 

Beachten Sie, dass replace() das Wort überall in der Zeichenfolge entfernen, selbst wenn es als eine einfache Teilkette auftritt. Sie können dies vermeiden, indem Sie Regexes mit einem Muster wie ^the\b verwenden.

+0

Danke. Das war sehr hilfreich. – prabhu

14

Ohne regexp könnten Sie tun, wie folgt:

places = ['of New York', 'of the New York'] 

noise_words_set = {'of', 'the', 'at', 'for', 'in'} 
stuff = [' '.join(w for w in place.split() if w.lower() not in noise_words_set) 
     for place in places 
     ] 
print stuff 
+0

Ausgezeichnet! Vielen Dank! – prabhu

+0

Ich bin darauf gestoßen und hatte keine Ahnung, was hier los ist. Wenn jemand darüber stolpert und sich fragt, was für eine Magie passiert, wird das Listenverständnis genannt und dies ist ein guter Artikel, der es erklärt http://carlgroner.me/Python/2011/11/09/An-Introduction-to-List-Comprehensi-s- in-Python.html –

Verwandte Themen