イテラブルのすべての値がゼロであるかどうかを確認するための、適切で簡潔な組み込みの方法はありますか?現在私はall()
を少しのリスト内包で使用していますが、(私にとって)より表現力のある方法があるはずです。私はこれをCのmemcmp()
といくらか同等と見なします。
_values = (0, 0, 0, 0, 0)
# Test if all items in values Tuple are zero
if all([ v == 0 for v in values ]) :
print 'indeed they are'
_
私は次のようなことをする組み込み関数を期待します:
_def allcmp(iter, value) :
for item in iter :
if item != value :
return False
return True
_
その関数はpython=に存在しますが、私は盲目ですか、または元のバージョンをそのまま使用する必要がありますか?
私はallcmp()
が解決策であることを示唆していません。これは、私がthinkのほうがより意味があるかもしれないことの例です。これは、Pythonの新しい組み込みを提案する場所ではありません。
私の意見では、all()
はそれほど意味がありません。 「すべて」が何をチェックしているかを表すものではありません。 all()
は反復可能であると想定できますが、関数が何を探しているかを表していない(bool
sの反復可能で、True
のすべてをテストします) 。私が求めているのは、2つのパラメーター(反復可能値と比較値)を取る2つのパラメーターmy allcmp()
のような(== --- ==)関数です。私が作ったallcmp()
に似た組み込み関数があるかどうか尋ねています。
私はCの背景とallcmp()
のためにmemcmp()
を呼び出しました作成した関数の名前は関係ありませんここにあります。
このような場合は、リストではなくジェネレータを使用してください。
all(v == 0 for v in values)
編集:
all
は標準ですPython組み込み。効率的になりたい場合Pythonプログラマーはおそらくそれらの半分以上を知っているはずです(- http://docs.python.org/library/functions.html )。alltrue
はall
よりも優れた名前であると主張するのは、C while
はwhiletrue
と呼ぶ必要があります。主観的ですが、ほとんどの人は組み込みの短い名前を好むと思います。これは、とにかく何をするかを知っている必要があり、たくさん入力する必要があるためです。
Pythonプログラマーのほとんどは、私が数秒で書いたコードを理解します。おそらくこのコードを私のガールフライド(彼女はプログラマーではなく、Pythonを使用したことがない建築家です)でテストし、彼女はそれを理解すると思います。ジェネレーターはよりエレガントな構文を持っているため、ジェネレーターを使用する方がnumpyを使用するよりも優れています。numpyはより高速かもしれませんが、ごくまれな場合にのみメリットがあります(私が示したようなジェネレーターは高速であり、このコードがプログラムのボトルネックである場合にのみメリットがあります)。
Pythonの説明はこれ以上ありません。
PS。これをmemcpmスタイルで実行する場合のコードは次のとおりです(私はすべてのバージョンが好きですが、おそらくこれが好きかもしれません)。
list(l) == [0] * len(l)
イテラブルに整数のみが含まれることがわかっている場合は、次のようにすることができます。
if not any(values):
# etc...
Valuesがnumpy配列の場合、次のように記述できます
import numpy as np
values = np.array((0, 0, 0, 0, 0))
all(values == 0)
Any()関数は、それを実現するための最もシンプルで簡単な方法です。イテラブルが空の場合。すべての要素はゼロであり、Falseを返します。
values = (0, 0, 0, 0, 0)
print (any(values)) # return False
組み込みset
には反復可能オブジェクトが与えられ、一意の値のコレクション(セット)を返します。
したがって、ここでは次のように使用できます。
set(it) == {0}
it
が反復可能であると仮定{0}
はゼロのみを含むセットですドキュメントのpython set-types-set-frozenset here に関する詳細情報)。