Pythonの配列(リスト)からNoneを削除したい。
Pythonで複数のデータを処理するとリストにNoneが紛れ込むことがある。
Noneは数値でも文字列でもないので処理が難しい。
今回はそんなNoneをリストから削除する方法を紹介する。
この記事を書いている人
記事を読むメリット
PythonのリストからNoneを削除する方法がわかる
リストからNoneを削除する方法
リストからNoneを削除したい。
逆に言えばNone以外を取得したいということだ。
少し抽象化すると、リストの各要素に対して条件を使って条件に合う内容を取得する。
方法としては4つある。
listからNoneを削除する方法
では以下のリストを対象として順に見ていく。
list_a = [0, 1, 2, 3, None, 5, 6, 7] print(list_a) # [0, 1, 2, 3, None, 5, 6, 7]
filterを使う方法
filterを使うにはfilter関数の引数に None
と 対象のリスト
をセットする。
すると返り値として filterオブジェクトが返される。
filterオブジェクトをlistに変換すると中身を見ることができる。
list_a_filtered = filter(None, list_a) print(list_a_filtered) print(list(list_a_filtered)) # <filter object at 0x0000025F40A48358> # [1, 2, 3, 5, 6, 7]
結果を見ると 0
と None
が削除されている。
仕組みとしてはリストの中の0
と None
をfilterが False
として判定して除外している。
filter + lambda を使う方法
filterの第1引数の条件にlambdaをセットすると以下のようになる。
list_a_filtered = filter(lambda a:a is not None, list_a) print(list(list_a_filtered)) # [0, 1, 2, 3, 5, 6, 7]
今回は None
のみが削除されている。
lambdaの判定式 is not None
をリストの各要素に適用して、 True
だった要素をリストとして返してくれている。
リスト内包表記を使う方法
リスト内包表記を使って条件抽出をすると以下のようになる。
list_a_filtered = [x for x in list_a if x] print(list_a_filtered) # [1, 2, 3, 5, 6, 7]
これもfilterのとき同様に 0
を条件に合致しない False
として判定しているので 0
を含まないリストを返している。
リスト内包表記で is not None を使う方法
0は残したい場合はlambdaを使ったときのように is not None
を判定条件として指定する。
list_a_filtered = [x for x in list_a if x is not None] print(list_a_filtered) # [0, 1, 2, 3, 5, 6, 7]
すると 0
は残して None
だけ削除したリストを得ることができる。
まとめ
今回はPythonでリストからNoneを削除する方法について紹介した。
方法は以下の通り。
listからNoneを削除する方法
Pythonの配列(リスト)からNoneを削除したい場合は、filterもしくはリスト内包表記を使おう。
Noneと0を区別して0を残したい場合は条件式に is not None
を指定しよう。
参考
Pythonのコードが出来上がったら次は定期的に実行させる環境に移してコードを実行すると思う。
ランニングコストをかけてネット上に実行環境を作るのもありだが、小型PCを購入してランニングコストを下げるのも1つの手かと思われる。
小型PCの魅力とオススメの機種について書いた記事があるので、もしよければ参考にして欲しい。
あわせて読みたい