2016-05-04 6 views
4

これまでネストされたループで学習していましたが、別のリストから文字列のリストをフィルタリングするかなり複雑な方法があるかどうかは疑問でした文字列。 私は基本的に300列のpandasデータフレームを持っていて、いくつかのキーワードがあれば、データフレームからいくつかの列を取り除きたいと思っています。次に、列タイトルを指定して新しいデータフレームを作成する予定です。ここで 文字列のリストを別の文字列リストから除外するPythonicの方法

は私のリスト内包の試みです:

filter_array = ['hi', 'friend'] 
col_names = ['nice', 'to', 'meet', 'you' + 'friend'] 
p = [i for i in col_names if i not in filter_array] 
print(p) 
p = [i for i in col_names if e for e in filter_array e not in i] 
print(p) 
p = [i for i in col_names if e not in i for e in filter_array] 
print(p) 

最初の試みは動作しますが、削除されません "あなた+友達のフィルタ単語が存在するが、COL名がそのように維持され、正確に同じです。 私の最後の試みは 'eが割り当て前に参照されています'を示します

なぜpythonのタグがないのですか? :)男とギャル

+1

ありがとうございました! –

答えて

5

おかげで私は、これはあなたが探している結果を取得すると思う:

>>> filter_array = ['hi', 'friend'] 
>>> col_names = ['nice', 'to', 'meet', 'you' + 'friend'] 
>>> 
>>> [c for c in col_names if all([f not in c for f in filter_array])] 
['nice', 'to', 'meet'] 

それはあなたが内側[]をドロップすることができ(コメント)は注目に値しますその内部リストの理解をジェネレータ式に変更するためのallの呼び出し。リストの理解度はより多くのメモリを使用しますが、発生器のすべてのステップが消費されなければならない場合(allが短絡できない場合)、ジェネレータ式より優れています。 allの代わりにanyを使用してロジックを反転することもできます。例:

>>> [c for c in col_names if all(f not in c for f in filter_array)] 
['nice', 'to', 'meet'] 
>>> [c for c in col_names if not any(f in c for f in filter_array)] 
['nice', 'to', 'meet'] 
+2

また、 'not 'を文章に入れるのではなく、' not any(fはfilter_arrayのfにはありません) 'を使うこともできます。 'all'または' any'が短絡するので、リストの理解は価値があるのではなく、ジェネレータ式を使うことも考えています。 – Blckknght

+0

あなたはそうです - 答えの中のこれらの提案と例を書き留めました。 –

0

潜在的にこれを行うには、より効率的な方法は、あなたが持つセットAのコピーになりますfilteredSet = setA - setBような何かを、行うことができ、その後set()

へのタグのリストを有効にすることですそれからsetBの要素が削除されました。

+1

セットに変更するだけで、彼が助けを要求している部分文字列に対処するために何もしません。 –

関連する問題