5

キーワードで単語/フレーズのリストをフィルタリングしようとしています。私が見つけたfilter()関数の例はすべて数値を使用しているので、これが可能かどうか疑問に思っています。filter()それが呼び出す関数が を返す場合、結果のリストに項目が入れられることを私は知っていますTrue

私はこのようなものを持っているとしましょう:

def filtCheck(item, filt):
    if filt in item:
        return True

def funct():
    filt = 'Hi'
    set1 = ['Hello, world', 'Hi there', 'Hi friend']
    set2 = filter(filtCheck(filt), set1)

    print set2

ここで私は混乱します。set2 行に最初のパラメーターをどのように正確に記述しますか? 私の filtCheck 関数は 2 つのパラメーターを取り、私は 1 つしか提供しないため、明らかにその書き方ではありません。filtCheck 関数も変更する必要がありますか? しかし、そこから item パラメーターを取り出すと、filt が含まれているかどうかを確認する文字列がありません。

4

5 に答える 5

7

You could use a lambda (see also http://docs.python.org/2/reference/expressions.html#lambda):

set2 = filter(lambda item: filtCheck(item, 'Hi'), set1)

Or you could use functools.partial:

from functools import partial
set2 = filter(partial(filtCheck, filt="Hi"), set1)

Or you could skip the filter function and use a list comprehension:

set2 = [item for item in set1 if filtCheck(item, "Hi")]

# or simply

set2 = [item for item in set1 if "Hi" in item]
于 2013-10-23T19:10:42.183 に答える
1

このコードに対する最も直接的な変更は、filtCheck がブール値ではなく関数を返すようにすることです。

def filtCheck(value):
    def is_in_list(lst):
        return value in lst
    return is_in_list

目的のために、function引数 forfilterは、正確に 1 つのパラメーターを取り、結果に含めるかどうかを示すブール値を返す任意の関数です。

ただし、フィルター ドキュメント ( http://docs.python.org/2/library/functions.html#filter ) から、

filter(function, iterable) は、function が None でない場合は [item for item in iterable if function(item)] と等価であり、function が None の場合は [item for item in iterable if item] と等価であることに注意してください。

この同等性とfilterpython3 で廃止されたという事実を組み合わせて、リスト内包表記を使用することをお勧めします。

def filtCheck(item, filt):
    if filt in item:
        return True

set2 = [item for item in set1 if filtCheck(filt, item)] 

filtCheckこれをさらに単純化して、完全に使用する必要をなくすことができます。

def funct():
    filt = 'Hi'
    set1 = ['Hello, world', 'Hi there', 'Hi friend']
    set2 = [item for item in set1 if filt in item]

    print set2
于 2013-10-23T19:32:14.610 に答える