Pythonの組み込みの filter()
関数は、反復可能なオブジェクト(辞書、リストなど)から特定の要素をフィルター処理し、新しい反復子を生成できます。反復可能なオブジェクトは、「トラバース」できるPythonオブジェクトです。つまり、要素を順番に返し、 fo
rループで使用できるようにします。
filter()
関数の基本的な構文は次のとおりです。
filter(function, iterable)
list()
関数を使用してリストに変換できる反復可能なフィルターオブジェクトを返します。このリストには、フィルターオブジェクトで返されるすべてのアイテムが含まれます。
filter()
関数によって提供されるフィルタリングメソッドは、特に大きなデータセットを扱う場合は、通常、リスト内包表記を使用するよりも効果的です。たとえば、リスト内包表記は新しいリストを生成し、プロセスの実行時間を増やします。リスト内包表記が式の実行を終了すると、メモリ内に2つのリストが作成されます。ただし、 filter()
は、元のリストへの参照、提供された関数、および元のリスト内の位置のインデックスを含む単純なオブジェクトを生成するため、操作にかかるメモリは少なくなります。
filter()
の4つの異なる使用法は次のとおりです。
filter()
**で特別な関数を使用する##filter()
の最初のパラメーターは関数であり、2番目のパラメーターによって参照される反復可能オブジェクト内の各アイテムの離脱と離脱を決定するために使用されます。この関数が呼び出された後、 False
が返されると、2番目のパラメーターの反復可能オブジェクトの対応する値が削除されます。この関数の場合、特に式がそれほど複雑でない場合は、通常の関数または「ラムダ」関数にすることができます。
filter()
で lambda
関数を使用する方法は次のとおりです。
filter(lambda item: item[] expression, iterable)
lambda
関数の次のリストを使用して、 lambda
関数の式に従ってリスト内の要素をフィルタリングします。
creature_names =['Sammy','Ashley','Jo','Olly','Jackie','Charlie']
このリストの母音で始まる水族館の生き物の名前をフィルタリングするための lambda
関数は次のとおりです。
print(list(filter(lambda x: x[0].lower()in'aeiou', creature_names)))
ここでは、リスト内の項目を「x」として宣言し、「x [0]」の方法で各文字列の最初の文字にアクセスし、文字を小文字に変換して、 'aeiou'
の文字が一致します。
最後に、反復可能なオブジェクト creature_name
を指定します。前のセクションと同様に、 list()
を使用して、返された結果をリストテーブルに変換します。
出力は次のとおりです。
[' Ashley','Olly']
もちろん、関数を書くことで同様の結果を得ることができます。
creature_names =['Sammy','Ashley','Jo','Olly','Jackie','Charlie']
def names_vowels(x):return x[0].lower()in'aeiou'
filtered_names =filter(names_vowels, creature_names)print(list(filtered_names))
creature_names
のフィルタリングを完了するために、 names_vowels
関数で式が使用されます。
同様に、出力は次のとおりです。
[' Ashley','Olly']
一般に、 filter()
関数でラムダ関数を使用した結果は、通常の関数を使用して得られた結果と同じです。フィルタリングするデータがより複雑な場合は、通常の式を使用することもできます。これにより、コードの読みやすさが向上する場合があります。
filter()
##で None
**を使用しますfilter()
の最初のパラメーターとして None
を使用して、長さが0のオブジェクト(空のリストや空の文字列など)など、Pythonでブール値が False
であるオブジェクトをイテレーターがフィルターで除外できるようにすることもできます。または、数値的に0に等しいオブジェクト。
次の例では、リストをフィルタリングして、ブール値が「False」である要素を削除します。
aquarium_tanks =[11, False,18,21,"",12,34,0,[],{}]
filtered_tanks =filter(None, aquarium_tanks)
このコードは filter()
でNoneを使用し、 aquarium_tanks
リストを反復可能なアイテムとして渡します。最初のパラメータとして None
を使用すると、リスト内の要素が False
であるかどうかを確認できます。
print(list(filtered_tanks))
次に、 filtered_tanks
をlist()
関数に渡して、リストを取得します。
出力結果からわかるように、必要な整数が得られ、ブール値が「False」であるアイテムが除外されます。
[11,25,18,21,12,34]
注: list()
を使用せずに filtered_tanks
を出力すると、と同様になります。<filter object at 0x7fafd5903240>
そのようなフィルターオブジェクト。フィルタオブジェクトは反復可能であるため、forループを使用して変換するか、 list()
を使用してリストに変換できます。
None
で、filter()
を使用して、 False
と見なされるアイテムをリストからすばやく削除します。
filter()
を使用します複雑なデータ構造の場合、 filter()
もその役割を果たします。たとえば、辞書のリストがある場合、リスト内の各項目(辞書)だけでなく、辞書内のすべてのキーと値のペアもトラバースする必要があります。すべてのデータを取得するため。
たとえば、水族館にいる各タイプの生き物のリストと、各タイプの生き物のさまざまな詳細があるとします。次のリストを使用して、このデータを表示します。
aquarium_creatures =[{"name":"sammy","species":"shark","tank number":"11","type":"fish"},{"name":"ashley","species":"crab","tank number":"25","type":"shellfish"},{"name":"jo","species":"guppy","tank number":"18","type":"fish"},{"name":"jackie","species":"lobster","tank number":"21","type":"shellfish"},{"name":"charlie","species":"clownfish","tank number":"12","type":"fish"},{"name":"olly","species":"green turtle","tank number":"34","type":"turtle"}]
この関数でデータをフィルタリングするには、以下の関数を記述します。 filter()
がすべての辞書と辞書内のすべての要素にアクセスするには、次のようにネストされた関数を作成する必要があります。
def filter_set(aquarium_creatures, search_string):
def iterator_func(x):for v in x.values():if search_string in v:return True
return False
returnfilter(iterator_func, aquarium_creatures)
aquarium_creatures
と search_string
をパラメーターとして filter_set()
関数を定義します。 filter_set()
で、内部関数 iterator_func()
を filter()
のパラメーターとして使用します。 filter_set()
関数は、 filter()
によって生成されたイテレーターを返します。
iterator_func()
は、 x
をパラメーターとして受け取ります。これは、リスト内の項目(つまり、単一の辞書)を表します。
次に、 for
は辞書内の各キーと値のペアをループし、条件ステートメントを使用して、 search_string
がキーと値のペアの値であることを確認します。
iterator_func
関数は、反復オブジェクトをフィルタリングするための filter
関数のパラメーターオブジェクトとして使用されます。例: filter_set()
を使用して文字列を検索します。
filtered_records =filter_set(aquarium_creatures,"2")
関数が実行されると、フィルター[オブジェクトストレージ](https://cloud.tencent.com/product/cos?from=10680)が filtered_records
変数に含まれ、リストに変換して出力します。
print(list(filtered_records))
出力内容:
[{' name':'ashley','species':'crab','tank number':'25','type':'shellfish'},{'name':'jackie','species':'lobster','tank number':'21','type':'shellfish'},{'name':'charlie','species':'clownfish','tank number':'12','type':'fish'}]
前の例では、 filter()
を使用して、辞書のリスト内の指定された文字をフィルタリングしました。
この記事では、 filter()
関数を使用するさまざまな方法を示します。詳細については、「Python University Practical Course」(Electronic Industry Press)をお読みください。これは、エンジニアリングの実践に特に重点を置いたゼロスタートの読者にとっては珍しい読み物です。
Recommended Posts