web-dev-qa-db-ja.com

リスト内の「なし」の出現回数を数える方法は?

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を試しましたが、うまくいきませんでした。

19
Hrabal

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を使用しないでください。

31

二通り:

1つ、リスト式

len([x for x in lst if x is not None])

2つは、Noneを数え、長さからそれらを引きます。

len(lst) - lst.count(None)
10
RemcoGerlich
lst = ['hey','what',0,False,None,14]
print sum(1 for i in lst if i != None)
4
kvorobiev

最近、関数を含むライブラリをリリースしました 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
0
MSeifert

Numpyを使用する

import numpy as np

list = np.array(['hey', 'what', 0, False, None, 14])
print(sum(list != None))
0
Rémi Baudoux