Python

[Python] リストからNoneを削除する方法

[Python] リストからNoneを削除する方法

Pythonの配列(リスト)からNoneを削除したい。
Pythonで複数のデータを処理すると処理するリストにNoneが紛れ込むことがある。
Noneは数値でも文字列でもないので処理が難しい。
今回はそんなNoneをリストから削除する方法を紹介する。


リストからNoneを削除する方法

リストからNoneを削除したいので、
逆に言えばNone以外を取得したいということだ。

少し抽象化すると、リストの各要素に対して条件を使って条件に合う内容を取得する。

方法としては4つある。

  • filterを使う方法
  • filter + lambda を使う方法
  • リスト内包表記を使う方法
  • リスト内包表記で is not 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]



結果を見ると 0None が削除されている。

仕組みとしてはリストの中の0Noneを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を削除したい場合は、filterもしくはリスト内包表記を使おう。
Noneと0を区別して0を残したい場合は条件式に is not None を指定しよう。


KRSW

駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

役に立ったらシェアしてくれると励みになります。
If you felt this article is useful, please share.
にほんブログ村 IT技術ブログへ

-Python

Translate »
Social media & sharing icons powered by UltimatelySocial

Copyright© ITips , 2020 All Rights Reserved.