2017-11-17 10 views
1

私はPythonの初心者であり、単語フィルタリング( 'ホワイトリスト'に存在する 'キーワード'リスト内の項目のみを抽出する)を行いたいと考えています。私はそのように( 「ホワイトリスト」にある)「猫」、「犬」、および「牛」を除くすべての単語を削除したいPythonは2つのリストとフィルタリング項目を比較します

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 

:ここ

は、これまでの私のコードです結果( 'keyword_filter' リスト)は次のようになります。

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

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

しかし、私はこのような結果に何かを得ました

アドバイスをいただければ幸いです。

+0

はい結果['Cat、Cow'、 'Dog'、 ''、 'C​​at']が必要です。それを言いたくて申し訳ありません。 – Jay

+0

@ Jean-FrançoisFabreそれは動作しません。単語はコンマで区切られた文字列です。 –

答えて

3

リスト内の文字列を分割し、分割内の単語がホワイトリストに含まれているかどうかを確認する必要があります。

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'] 

ベター各単語の検索のパフォーマンスを向上させるためにwhitelistセットを作るために:その後は、フィルタリング後のホワイトリストにあるすべての単語を再度参加します。

また、ホワイトリストに含まれる各単語の一致する文字列のすべての部品を見つけるre.findallを使用することができ、その後、は、マッチを見つけた後に再参加:

import re 

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

ありがとうございます。私は本当にあなたの助けに感謝します。他にもありがとう。君たちは最高です! – Jay

1

はこれを試してください。..

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

簡易リストの理解:

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) 

出力:キーワードリストの順序を保持したいので、あなたが最も外側のループとしてそれを持ってしたいと思う

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) 
0

あなたは正規表現を使用することができます。

for phrase in keyword:

今、あなたは、その実際の言葉の中にフレーズを分割し、それらの単語は、ホワイトリストにあるかどうかを判断する必要があります。次に、言葉を一緒に戻す必要があります。これは1行で行うことができます。

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

内訳:phrase.split(", ")があなたの元の文字列に「」で区切られた文字列のリストできます - あなたが気にすなわち言葉を。 word in ... if word in whitelistlist comprehensionです。 ...の各単語のリスト(この場合はphrase.split)が返されます。条件はword in whitelistです。最後に、", ".join(...)は、リスト内のすべての要素で構成される文字列を返します。... "、"で接続します。

最後に、フィルタリングされた文字列のリストに新しくフィルタリングされた文字列を配置する必要があります。追記として

keyword_filter.append(filtered) 

、私はあなたがホワイトリストの言葉のあなたのコレクションのためのsetを使用する必要があります他の人と同意します。それははるかに高速な検索時間を持っています。しかし、この例のような単語のリストは、パフォーマンスの違いに気付かれません。

1

['Cat, Cow', 'Dog', '', 'Cat'] 
関連する問題