Pythonのfilter()関数でリスト内のxより小さい値をすべて抽出する方法
数値のリスト nums と、もうひとつの数値 x が与えられたとします。このとき、nums の中から x より小さい値だけをフィルタリングして取り出す方法を解説します。
Pythonには filter() という組み込み関数があり、引数として関数を受け取り、その関数の条件に合う要素だけを抽出できます。これを使えば、簡潔なコードで目的の処理を実現できます。
問題の例
たとえば、入力が次のような場合を考えてみましょう。
nums = [1,5,8,3,6,9,12,77,55,36,2,5,6,12,87] x = 50
この場合、50より小さい値だけが残るため、出力は次のようになります。
[1, 5, 8, 3, 6, 9, 12, 36, 2, 5, 6, 12]
解決の手順
引数
aを受け取る関数(またはラムダ式)を定義します。a < xであれば True を返し、そうでなければ False を返すようにします。filter()を使って、この関数の条件を満たす要素だけをnumsから抽出します。filterオブジェクトはイテレータなので、
list()でリストに変換して返します。
実装例
以下のコードは、ラムダ式を filter() に渡して処理を行うシンプルな実装です。
def solve(nums, x):
left_items = filter(lambda a: a < x, nums)
return list(left_items)
nums = [1,5,8,3,6,9,12,77,55,36,2,5,6,12,87]
x = 50
print(solve(nums, x))入力
[1,5,8,3,6,9,12,77,55,36,2,5,6,12,87], 50
出力
[1, 5, 8, 3, 6, 9, 12, 36, 2, 5, 6, 12]
補足:リスト内包表記との比較
同じ処理は、リスト内包表記を使っても書けます。どちらも読みやすく効率的ですが、状況に応じて使い分けるとよいでしょう。
def solve(nums, x):
return [a for a in nums if a < x]filter() は遅延評価されるため、大量のデータを扱う場合でもメモリ効率が良いという利点があります。一方、リスト内包表記はPythonらしい直感的な書き方として広く好まれています。
-
Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム
問題の概要二分木が与えられたとき、その木に含まれるすべてのノードが同じ値を持っているかどうかを判定することを考えます。例えば、次のような二分木が入力として与えられた場合、すべてのノードが同じ値を持っているため、出力は True になります。解決のアプローチこの問題は、再帰を使ってシンプルに解くことができます。以下の手順に従います。solve() 関数を定義します。この関数は root(現在のノード)と val(比較対象の値)を引数として受け取ります。root が null(None)の場合は、True を返します。空の部分木は条件を満たしているとみなせるためです。val が未定義の場合は、ro
-
Pythonで二分探索木(BST)から指定範囲外のノードをすべて削除する方法
問題の概要二分探索木(BST)と2つの値 low、high が与えられたとき、[low, high] の範囲(境界値を含む)に該当しないノードをすべて木から削除するプログラムを作成します。例として、次のようなBSTを考えてみましょう。ここで low = 7、high = 10 とした場合、範囲外のノード(5 や 1 など)が削除され、出力は次のようになります。解法のアプローチこの問題は再帰を利用することで簡潔に解くことができます。手順は以下の通りです。関数 solve() を定義します。引数は root(現在のノード)、low、high の3つです。root が null(空)の場合は何もせず