2016-05-25 9 views
1

ネストされた "for"ループを使用せずに2つのリストを反復処理するにはどうすればよいですか?入れ子の "for"ループを使用せずに2つのリストを反復する方法

二つのリストの間のインデックスは、必ずしも、より具体的に、私は文字列のリストと禁止単語のリストを取る関数をコーディングしています同じ

である必要はありません。禁止された単語のいずれかが文字列のそれぞれにある場合、その文字列全体が削除されます。

私がやってみました

for word in bannedWords: 
    for string in messages: 
     if word in string: 
      messages.remove(string) 

これを、文字列変数がそのように台無し「のための」ループをメッセージから文字列をします削除し、「for」ループで使用されているためしかし、動作しません。 。実装するためのより良い方法は何ですか?ありがとう。

def filter_messages(messages, bannedWords): 
    for string in messages: 
     if all(word not in string for word in bannedWords): 
      yield string 

今すぐあなただけのあなたに良いメッセージを与える ジェネレータ関数を持っている:

+0

それはあなたがのために「入れ子に必要な私には思えますあなたがしたいことをするループ。あなたの問題は実際には: "それを繰り返しながらリストから項目を削除するにはどうすればいいですか?"ここでいくつかの答えを見つけることができます:http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating-in-python – Mel

答えて

2

あなたは、おそらくラインでそれを行うことができます!禁止された単語のセットと、これらの悪い言葉が含まれている可能性がある文字列のリストを想定し

messages = [string for string in messages 
       if not any(word in bannedWords for word in string)] 
+1

ここで 'x'は1文字になります。 – interjay

+0

それは言葉になります。貧しい変数の命名の選択肢を修正しましょう。 – SuperSaiyan

+0

名前を付けても、文字列を反復すると個々の文字が得られます。 – interjay

1

私はおそらくのようなものを書くでしょう。あなたが本当に場所でmessagesを更新したい場合は、行うことができます:

messages[:] = filter_messages(messages, bannedWords) 

をインプレース要件はまれですが:

messages = list(filter_messages(messages, bannedWords)) 
0

bannedWords = set("bad", "offensive") 

messages = ["message containing a bad word", "i'm clean", "i'm offensive"] 

cleaned = [x for x in messages if not any(y for y in bannedWords if y in x)] 

結果:

>>> cleaned 
["i'm clean"] 
>>> 
関連する問題