Pythonのリストをバリデーションする際に便利なプログラムをまとめてみました。
aはリスト型の配列とします。ただし、aが辞書型であっても以下のコードでaをa.values()と置き換えることでそのまま使えます。
文字列、数値共通
- aの中にNoneが1つでも存在する場合True
None in a
# 次のようにも記述できる
any(val is None for val in a)
not all(val is not None for val in a) # ド・モルガンの法則より
- aの中にNoneが1つも存在しない場合True
None not in a
# 次のようにも記述できる
all(val is not None for val in a)
not any(val is None for val in a) # ド・モルガンの法則より
- aの中に含まれる値が全てNoneである場合True
all(val is None for val in a)
not any(val is not None for val in a) # ド・モルガンの法則より
- aの中にNoneでない値が1つでも存在する場合True
any(val is not None for val in a)
not all(val is None for val in a) # ド・モルガンの法則より
- aの中に含まれる値がすべてホワイトリストに入っている値であればTrue
all(val in white_list for val in a)
not any(val not in white_list for val in a) # ド・モルガンの法則より
# setを使った場合
len(set(white_list) - a) == 0
- aの中に含まれる値がすべてブラックリストに入っていない値であればTrue
all(val not in black_list for val in a)
not any(val in black_list for val in a) # ド・モルガンの法則より
# setを使った場合
len(set(a) & black_list) == 0
数値のみに使える応用例
- aの中に含まれる値がすべてある値以上である場合True
all(val >= min_value for val in a)
- aの中に含まれる値がすべてある範囲の中に入っている場合True
all(min_value <= val <= max_value for val in a)
上のコード例では、aの中にNoneが含まれているとTypeErrorが発生してしまいます。当然、実行する前にそれらを弾く実装をしても良いですが、今回はせっかく内包記法を使っているということもあり内包記法の機能を最大限に使ってみましょう。
- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneは無視する)
# 以下2つのコードは同等のものである
all(min_value <= val <= max_value for val in a if val is not None)
all(min_value <= val <= max_value if val is not None else True for val in a)
- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneは範囲外のものとして扱う)
all(min_value <= val <= max_value if val is not None else False for val in a)
- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneには0を用いる)
all(min_value <= (val or 0) <= max_value for val in a)
- aの中に含まれる値がすべてある範囲の中に入っている場合True(Noneには中央値の値を用いる)
from statistics import median
med = median([val for val in a if val is not None])
all(min_value <= val <= max_value if val is not None else min_value <= med <= max_value for val in a)