None
ではないものを数えようとしていますが、False
と数値のゼロも受け入れてください。逆ロジック:None
として明示的に宣言されているものを除いて、すべてをカウントしたい。
カウントに含まれていない5番目の要素:
>>> list = ['hey', 'what', 0, False, None, 14]
>>> print(magic_count(list))
5
これがPython=通常の動作ではないことはわかっていますが、Pythonの動作をオーバーライドするにはどうすればよいですか?
これまでのところ、私はa if a is not None else "too bad"
、ただし機能しません。
私もisinstance
を試しましたが、うまくいきませんでした。
sum
またはTrue
、つまり1または0になる各オブジェクトが_is not None
_かどうかを確認するFalse
を使用するだけです。
_lst = ['hey','what',0,False,None,14]
print(sum(x is not None for x in lst))
_
またはpython2でfilter
を使用:
_print(len(filter(lambda x: x is not None, lst))) # py3 -> Tuple(filter(lambda x: x is not None, lst))
_
Python3にはNone.__ne__()
があります。これはNoneを無視し、ラムダを必要とせずにフィルタリングします。
_sum(1 for _ in filter(None.__ne__, lst))
_
sum
の利点は、値の完全なリストを作成する代わりに、一度に要素を遅延評価することです。
余談ですが、python list
をシャドウするため、変数名としてlist
を使用しないでください。
二通り:
1つ、リスト式
len([x for x in lst if x is not None])
2つは、Noneを数え、長さからそれらを引きます。
len(lst) - lst.count(None)
lst = ['hey','what',0,False,None,14]
print sum(1 for i in lst if i != None)
最近、関数を含むライブラリをリリースしました iteration_utilities.count_items
(OK、実際には3です。ヘルパーも使用しているためです is_None
および is_not_None
)そのため:
>>> from iteration_utilities import count_items, is_not_None, is_None
>>> lst = ['hey', 'what', 0, False, None, 14]
>>> count_items(lst, pred=is_not_None) # number of items that are not None
5
>>> count_items(lst, pred=is_None) # number of items that are None
1
Numpyを使用する
import numpy as np
list = np.array(['hey', 'what', 0, False, None, 14])
print(sum(list != None))