2017-11-17 6 views
1

Ich bin ein Anfänger von Python und möchte einige Wortfilterung durchführen (Extrahieren nur Elemente in 'Keyword' Liste, die in 'Whitelist' existieren).Python vergleicht zwei Listen und Filterelemente

Hier ist mein Code so weit:

whitelist = ['Cat', 'Dog', 'Cow'] 
keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat'] 
keyword_filter = [] 

for word in whitelist: 
    for i in range(len(keyword)): 
     if word in keyword[i]: 
      keyword_filter.append(word) 
     else: pass 

ich jedes Wort, außer für 'Cat', 'Dog' und 'Kuh' (die in der 'Weißen Liste'), so entfernen mag, dass das Ergebnis ("keyword_filter Liste) wird wie folgt aussehen:

['Cat, Cow', 'Dog', '', 'Cat'] 

Allerdings habe ich das Ergebnis in etwa so bekam:

['Cat', 'Cat', 'Dog', 'Cow'] 

Ich würde hochachtungsvoll schätzen, wenn Sie einen Rat geben können.

+0

Ja ich brauche das Ergebnis ['Cat, Cow', 'Dog', '', 'Cat'] in Reihenfolge. Entschuldige, dass ich es nicht erwähnt habe. – Jay

+0

@ Jean-FrançoisFabre Das wird nicht funktionieren. Die Wörter sind Zeichenketten getrennt durch Kommata :) –

Antwort

3

Sie müssen die Strings in der Liste aufteilen und prüfen, ob das Wort im Split in der Whitelist enthalten ist. Dann schließen alle Wörter in der weißen Liste nach Filterung:

whitelist = {'Cat', 'Dog', 'Cow'} 
filtered = [] 
for words in keyword: 
    filtered.append(', '.join(w for w in words.split(', ') if w in whitelist)) 

print(filtered) 
# ['Cat, Cow', 'Dog', '', 'Cat'] 

Bessere whitelist ein Set zu machen, die Leistung für die Suche eines jeden Wortes zu verbessern.

Sie könnten auch re.findall zu verwenden, um alle Teile jedes Wort in der Whitelist enthalten sind passende Strings finden, und dann schließen nach den Spielen zu finden:

import re 

pattern = re.compile(',?\s?Cat|,?\s?Dog|,?\s?Cow') 
filtered = [''.join(pattern.findall(words))) for words in keyword] 
+1

Vielen Dank. Ich schätze deine Hilfe sehr. Danke auch allen anderen. Ihr seid die Besten! – Jay

1

dies versuchen ..

whitelist = ['Cat', 'Dog', 'Cow'] 
keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat'] 
keyword_filter = [] 

for word in keyword: 
    whitelistedWords = [] 
    for w in word.split(', '): 
     if w in whitelist: 
      whitelistedWords.append(w) 
      #print whitelistedWords 
    keyword_filter.append(', '.join(whitelistedWords)) 

print keyword_filter 
1

Einfache Liste Verständnis:

whitelist = ['Cat', 'Dog', 'Cow'] 
keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat'] 
keyword_filter = [', '.join(w for w in k.split(', ') if w in whitelist) for k in keyword] 

print(keyword_filter) 

Der Ausgang:

['Cat, Cow', 'Dog', '', 'Cat'] 
0

Sie könnten regex verwenden:

import re 

whitelist = ['Cat', 'Dog', 'Cow'] 
keyword = ['Cat, Cow, Horse', 'Bird, Whale, Dog', 'Pig, Chicken', 'Tiger, Cat'] 
keyword_filter = [] 

for words in keyword: 
    match = re.findall('(' + r'|'.join(whitelist) + ')[,\s]*', words) 
    keyword_filter.append(', '.join(match)) 
print(keyword_filter) 
1

Da Sie die Reihenfolge Ihrer Keyword-Liste erhalten wollen, werden Sie haben wollen, dass als die äußerste Schleife.

for phrase in keyword:

Nun müssen Sie den Satz in seine tatsächlichen Worte aufzuspalten und festzustellen, ob diese Worte in der weißen Liste sind. Dann müssen Sie die Wörter wieder zusammensetzen. Sie können dies in einer Zeile tun.

filtered = ", ".join(word in phrase.split(", ") if word in whitelist) 

Aufteilung: phrase.split(", ") gibt Ihnen eine Liste von Strings, die durch „“ in der ursprünglichen Zeichenfolge getrennt waren - das heißt, die Worte, die Sie interessieren. word in ... if word in whitelist ist ein list comprehension. Es wird eine Liste jedes Wortes in ... zurückgegeben, in diesem Fall phrase.split, das die Bedingung word in whitelist erfüllt. Schließlich gibt Ihnen ", ".join(...) eine Zeichenfolge, die aus jedem Element in der Liste ... besteht, das mit "," verbunden ist.

Zuletzt müssen Sie die neu gefilterte Zeichenfolge in die Liste der gefilterten Zeichenfolgen einfügen.

keyword_filter.append(filtered) 

Als Nebenbemerkung, ich stimme mit anderen, dass Sie eine set für Ihre Sammlung von weißen Liste Wörter verwenden sollten. Es hat viel schnellere Nachschlagezeit. Für eine winzige Liste von Wörtern wie diesem Beispiel werden Sie jedoch keinen Leistungsunterschied bemerken.

Verwandte Themen