2012-03-08 6 views
6

私は文字列のリストを持っていますが、その中に 'http://'が含まれている行はすべて 'lulz'、 ' lmfao '、' .png '、またはその中の文字列のリスト内の他の項目を削除します。私はこれについてどうやって行くのですか?文字列にPythonの文字列のリストが含まれていない場合

私の本能は私に正規表現を使用するように指示しますが、私は魔法に道徳的な反対をしています。あなたのオプションをより柔軟に必要がある場合は、

for s in strings: 
    if 'http://' in s and not 'lulz' in s and not 'lmfao' in s and not '.png' in s: 
     # found it 
     pass 

その他のオプション:

答えて

10

は除外する文字列のリストが大きい場合、かなり拡張可能ですオプションです。

exclude = ['lulz', 'lmfao', '.png'] 
filter_func = lambda s: 'http://' in s and not any(x in s for x in exclude) 

matching_lines = filter(filter_func, string_list) 

リストの内包表記の代替:

matching_lines = [line for line in string_list if filter_func(line)] 
+0

恐ろしい!私はラムダを使うようになる!私はそれが何らかの理由で存在していることを知っていました! – directedition

+1

あなたはそうする必要はありません。 'lambda'は変数' filter_func'を設定するのではなく、関数をインラインで定義することを可能にします。しかし、あなたは 'def filter_func(s) 'と同じように簡単に書くことができます:' http:// 'を' s 'に返します。関数はオブジェクトであることを忘れないでください。 –

+0

私はこれが 'lambda 'の不適切な使用であると言うことさえあります。ここではそれを 'def'にする方が良いでしょう。 – wim

2

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

words = ('lmfao', '.png', 'lulz') 
for s in strings: 
    if 'http://' in s and all(map(lambda x, y: x not in y, words, list(s * len(words))): 
     # found it 
     pass 
+0

だった:私はこのそれプリントを実行すると

haystack = ['http://blah', 'http://lulz', 'blah blah', 'http://lmfao'] exclude = ['lulz', 'lmfao', '.png'] http_strings = (s for s in haystack if s.startswith('http://')) result_strings = (s for s in http_strings if not any(e in s for e in exclude)) print list(result_strings) 

を私の最初のアプローチ。しかし、私のリストが成長し、ラインが扱いにくくなったとき、私はもっと良い方法があることを望んでいました。 – directedition

+1

ストップワードのリストを拡張したいと思えば、それは手を抜くことができます。どのようにあなたのアプローチを変えますか?しかし、それでもなお、単純な解決策のために+1。 – prelic

3

これはFJのソリューションとほぼ同等であるが、代わりにラムダ式のgenerator expressionsとフィルタ機能使用しています:

['http://blah'] 
+0

+1ジェネレータ。しかし、あなたがこれを(ほぼ)1つのライナーとして行うことができることに注意してください: 's_startswith( 'http://')であればhaystackのsのためのresult_strings = [s] )] '。 80列(ほとんどのスタイルガイド)に合うように改行が必要ですが、2ジェネレーターバージョンよりも若干容易であると主張します。 timeitはまた、これがかなり早く、またF.Jのフィルタバージョン(IMOがこの3つのうち最も難しい)よりもわずかに速いことも報告しています。 – lvc