あらま、filter の function に None を渡せるのね@Python

かなり使うのに、気付いてなかった…。

辞書から無効値を持つ項目を取り除く@python」では使えないけれど。

filterってこんな使い方が出来たのね:

1 >>> filter(None, ["a", "", "c"])
2 ['a', 'c']
3 >>> filter(None, ["a", "", "c", None, "d"])
4 ['a', 'c', 'd']

CGIHTTPServerを眺めてて知った。

ちゃんとドキュメントされてた:

iterable のうち、 function が真を返すような要素からなるリストを構築します。 iterable はシーケンスか、反復をサポートするコンテナか、イテレータです。 iterable が文字列型かタプル型の場合、結果も同じ型になります。そうでない場合はリストとなります。 function が None の場合、恒等関数を仮定します。すなわち、 iterable の偽となる要素は除去されます。

辞書から無効値を持つ項目を取り除く@python」では調べなければいけないのはキーが無効であることではなく値が無効であることなので、

 1 >>> d = dict(a=1, b=None, c="")
 2 >>> filter(lambda k: d[k], d)  # EXPECTED
 3 ['a']
 4 >>> dict(((k, d[k]) for k in filter(lambda k: d[k], d)))
 5 {'a': 1}
 6 >>> 
 7 >>> filter(None, d)  # NOT EXPECTED
 8 ['a', 'c', 'b']
 9 >>> dict(((k, d[k]) for k in filter(None, d)))
10 {'a': 1, 'c': '', 'b': None}

てわけで結局は None ではダメなわけなんですな。



Related Posts