web-dev-qa-db-ja.com

リストのすべてが==何かの場合

Python 2.6を使用して、シーケンスのすべての項目が指定された値と等しいかどうかを1つのステートメントで確認する方法はありますか?

[pseudocode]
my_sequence = (2,5,7,82,35)

if all the values in (type(i) for i in my_sequence) == int:
     do()

代わりに、次のように言います。

my_sequence = (2,5,7,82,35)
all_int = True
for i in my_sequence:
    if type(i) is not int:
        all_int = False
        break

if all_int:
    do()
25
Zoomulator

使用する:

all( type(i) is int for i in lst )

例:

In [1]: lst = range(10)
In [2]: all( type(i) is int for i in lst )
Out[2]: True
In [3]: lst.append('steve')
In [4]: all( type(i) is int for i in lst )
Out[4]: False

[編集]。コメントに従ってよりきれいになりました。

55
Autoplectic

もしかして

all( type(i) is int for i in my_list )

編集:isに変更されました。やや速い。

13
S.Lott

私はお勧めします:

if all(isinstance(i, int) for i in my_list):

all および any は2006年に Python 2.5(機能はRaymond Hettingerによって実装された) とともに初めて登場しました。
古いバージョンのPythonを使用している場合、リンクはサンプル実装を提供します。

isinstance の使用もお勧めします。これは、intのサブクラスもキャッチするためです。

8
tzot

完全を期すために、NumPyの「すべて」が組み込みの「すべて」とは異なるという事実を付け加えようと思いました。たとえば、Python= Python(x、y)を実行している場合、NumPyは自動的にロードされます(そして、私の知る限りアンロードできません)。そのため、上記のコードを実行しようとすると、かなり予期しない結果になります。結果:

>>> if (all(v == 0 for v in [0,1])):
...     print 'this should not happen'
... this should not happen

これに関する詳細は、スタックオーバーフローの質問numpyすべてが組み込みのすべてと異なるにあります。解決策として、ジェネレータをブラケットで囲んでリストを作成することができます。

>>> all( [v == 0 for v in [0,1]] )
False

または、組み込み関数を明示的に呼び出します。

>>> __builtins__.all(v == 0 for v in [0,1,'2'])
False

SpyderがデフォルトでNumPyをインポートしないようにする方法を見つけました:Spyder default module import list

1
MacL3an