2013-07-29 9 views
6

私はlist1list2を持っています。別のリストにある1つのリストの要素を削除する

list1=['paste', 'text', 'text', 'here', 'here', 'here', 'my', 'i', 'i', 'me', 'me'] 

list2=["i","me"] 

所望の出力:list2は、例えば、list1から除去されなければならない単語群である

list3=['paste', 'text', 'text', 'here', 'here', 'here', 'my'] 

私は今のところなくない結果「の」を使用して異なるバージョンを試みました。

いずれかのアイデアをいただければ幸いです!

+1

、ニース明確な、含まれていると短い質問は、良い質問に追いつきます。 – hetepeperfan

答えて

14

使用list comprehension

>>> list1 = ['paste', 'text', 'text', 'here', 'here', 'here', 'my', 'i', 'i', 'me', 'me'] 
>>> list2 = ["i","me"] 
>>> list3 = [item for item in list1 if item not in list2] 
>>> list3 
['paste', 'text', 'text', 'here', 'here', 'here', 'my'] 

は注:リストの検索はO(n)あり、代わりにlist2からsetを行うことを検討 - セットでのルックアップがO(1)です。

+2

常にリストの理解を使用してください。 Pythonを初めて使う人にとっては、リスト内包を説明する必要があるように感じます。 –

+1

ちょうど2つの項目について、 'list2'を' tuple'とすると、ほとんどの場合 'set'が実行されることに注意してください... –

+0

いつものように@JonClements、素晴らしいコメント、ありがとう! – alecxe

5

セット算定を利用するのはどうですか? (より効率的な)

diff = set(list1) - set(list2) 
result = [o for o in list1 if o in diff] 

あるいはさらに良い:

set2 = set(list2) 
result = [o for o in list1 if o not in set2] 
+1

list1の要素が(セットにすることなく)list2のセットにないことを確認するほうがはるかに安価です... –

+0

list1の重複を削除すると、設定されたオーバーヘッドがかかりますか?このデータの例では、繰り返される項目があります - 損益分岐点はどこに表示されるのでしょうか? – theodox

関連する問題