たとえば、次のように渡された場合:
a = []
a
空かどうかを確認するにはどうすればよいですか?
if not a:
print("List is empty")
空の暗黙のブールネスを使用することlist
は非常にPythonicです。
それを行うpythonicの方法は、PEP 8 style guideからのものです。
シーケンス (文字列、リスト、タプル) の場合、空のシーケンスは false であるという事実を使用します。
# Correct: if not seq: if seq: # Wrong: if len(seq): if not len(seq):
私は明示的にそれを好みます:
if len(li) == 0:
print('the list is empty')
このようにして、それがシーケンス (リスト) であることは 100% 明らかでli
あり、そのサイズをテストしたいと考えています。私の問題は、ブール変数if not li: ...
であるという誤った印象を与えることです。li
これは、「python test empty array」および同様のクエリに対する最初の Google ヒットです。さらに、他の人が単なるリストを超えて質問を一般化しているようです。使うかもしれません。
NumPy 配列には注意が必要です。slist
やその他の標準コンテナーに対して正常に機能する他のメソッドは、NumPy 配列では失敗するためです。以下で理由を説明しますが、要するに、推奨される方法は を使用することsize
です。
bool
NumPy は配列をs の配列にキャストしようif x
とし、それらすべてのbool
s を一度に評価して、ある種の集約された真理値を求めようとするため、「pythonic」の方法は NumPy 配列では失敗します。しかし、これは意味がないので、次のようになりますValueError
。
>>> x = numpy.array([0,1])
>>> if x: print("x")
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
しかし、少なくとも上記のケースは失敗したことを示しています。要素が 1 つだけの NumPy 配列がif
ある場合、エラーが発生しないという意味で、ステートメントは「機能」します。ただし、その 1 つの要素がたまたま0
(または0.0
、またはFalse
、...) である場合、if
ステートメントは誤って次のようになりFalse
ます。
>>> x = numpy.array([0,])
>>> if x: print("x")
... else: print("No x")
No x
しかし、明らかにx
存在し、空ではありません! この結果はあなたが望んでいたものではありません。
len
すると、予期しない結果が生じる可能性があります例えば、
len( numpy.zeros((1,0)) )
配列の要素が 0 であっても、1 を返します。
SciPy FAQで説明されているように、NumPy 配列があることがわかっているすべての場合の正しい方法は、次を使用することif x.size
です。
>>> x = numpy.array([0,1])
>>> if x.size: print("x")
x
>>> x = numpy.array([0,])
>>> if x.size: print("x")
... else: print("No x")
x
>>> x = numpy.zeros((1,0))
>>> if x.size: print("x")
... else: print("No x")
No x
list
、NumPy 配列、またはその他のものであるかどうかわからない場合は、このアプローチを@dubiousjim が提供する回答と組み合わせて、各タイプに適切なテストが使用されていることを確認できます。あまり「Pythonic」ではありませんが、NumPy は少なくともこの意味で意図的に Pythonicity を壊したことが判明しました。
入力が空かどうかを確認するだけでなく、インデックス作成や数学演算などの他の NumPy 機能を使用する必要がある場合は、入力を強制的に NumPy 配列にする方がおそらく効率的です (そして、より一般的です)。これをすばやく行うための優れた関数がいくつかあります — 最も重要なのはnumpy.asarray
. これは入力を受け取り、それがすでに配列の場合は何もしません。リストやタプルなどの場合は入力を配列にラップし、オプションでそれを選択した に変換しますdtype
。したがって、可能な限り非常に高速であり、入力が NumPy 配列であると想定できるようになります。配列への変換は現在のスコープの外に戻らないため、通常は同じ名前を使用します。
x = numpy.asarray(x, dtype=numpy.double)
これにより、x.size
このページに表示されるすべてのケースでチェックが機能します。
空のリスト自体は、真の値のテストではfalseと見なされます(Pythonのドキュメントを参照)。
a = []
if a:
print "not empty"
@ダレントーマス
編集:空のリストをFalseとしてテストすることに対する別のポイント:ポリモーフィズムはどうですか?リストがリストであることに依存するべきではありません。アヒルのようにいんちきする必要があります-要素がない場合、duckCollectionをどのようにして「False」をいんちきさせるのですか?
duckCollectionは、if a:が問題なく機能するように実装する__nonzero__
必要があります。__len__
パトリックの(受け入れられた)答えは正しいです:if not a:
それを行う正しい方法です。これはPEP 8スタイルガイドにあるというHarley Holcombeの答えは正しいです。しかし、どの回答も、イディオムに従うのが良い考えである理由を説明していません。個人的には、それが十分に明示的でなかったり、Ruby ユーザーを混乱させたりしているとわかったとしてもです。
Python コードと Python コミュニティには、非常に強力なイディオムがあります。これらのイディオムに従うと、Python の経験がある人にとってコードが読みやすくなります。そして、これらのイディオムに違反すると、それは強い合図です。
if not a:
空のリストをNone
、または数値の 0、または空のタプル、または空のユーザー作成のコレクション型、または空のユーザー作成の完全ではないコレクション型、または falsey を使用してスカラーとして機能する単一要素の NumPy 配列と区別しないのは事実です。価値観など。そして、それについて明確にすることが重要な場合もあります。その場合、何について明示したいのかを知っているので、正確にそれをテストできます。たとえば、if not a and a is not None:
は「None 以外の偽物」をif len(a) != 0:
意味し、一方、「空のシーケンスのみ - ここではシーケンス以外はすべてエラー」などを意味します。これは、テストしたいことを正確にテストするだけでなく、このテストが重要であることを読者に知らせます。
しかし、明確にすることが何もない場合if not a:
は、読者を誤解させる以外の何かがあります. そうではないのに、重要なことを知らせているのです。(コードの柔軟性を低下させたり、速度を落としたりすることもあるかもしれませんが、それはそれほど重要ではありません。) そして、このように習慣的に読者を誤解させると、区別を行う必要があるときに、見過ごされてしまいます。あなたはコード全体で「泣いているオオカミ」でした。
そもそもリストをテストする必要があることを疑問視する人は誰もいなかったようです。追加のコンテキストを提供しなかったため、そもそもこのチェックを行う必要はないかもしれませんが、Python でのリスト処理に慣れていないことが想像できます。
最もpythonicな方法は、まったくチェックせず、リストを処理することだと私は主張します。そうすれば、空であろうといっぱいであろうと正しいことをします。
a = []
for item in a:
<do something with item>
<rest of code>
これには、空の特定のチェックを必要とせずに、の内容を処理できるという利点があります。aが空の場合、依存ブロックは実行されず、インタープリターは次の行にフォールスルーします。
配列が空かどうかを実際にチェックする必要がある場合は、次のようにします。
a = []
if !a:
<react to empty list>
<rest of code>
十分なものです。
len()
Python のリスト、文字列、辞書、およびセットに対するO(1) 操作です。Python は、これらのコンテナー内の要素の数を内部的に追跡します。
JavaScriptには、 true/falsy の同様の概念があります。
私は書いていました:
if isinstance(a, (list, some, other, types, i, accept)) and not a:
do_stuff
これは-1に投票されました。それが、読者が戦略に反対したのか、提示された回答が役に立たないと思ったのかはわかりません. 後者のふりをします.---「Pythonic」と見なされるものは何でも---これが正しい戦略だからです。すでに除外していないかa
、たとえば が の場合を処理する準備ができている場合をFalse
除き、単なる よりも制限的なテストが必要ですif not a:
。次のようなものを使用できます。
if isinstance(a, numpy.ndarray) and not a.size:
do_stuff
elif isinstance(a, collections.Sized) and not a:
do_stuff
最初のテストは、上記の @Mike の回答に対するものです。3 行目は次のように置き換えることもできます。
elif isinstance(a, (list, tuple)) and not a:
特定のタイプ (およびそのサブタイプ) のインスタンスのみを受け入れたい場合、または次の場合:
elif isinstance(a, (list, tuple)) and not len(a):
明示的な型チェックなしで回避できますがa
、それが処理する準備ができている型の値であることを周囲のコンテキストが既に保証している場合、または処理する準備ができていない型が実行されることが確実な場合のみです。処理する準備ができているエラー (たとえば、未定義の値をTypeError
呼び出した場合) を発生させます。len
一般に、「pythonic」の慣習はこの最後の方法で行われるようです。アヒルのように絞って、鳴き方がわからない場合は DuckError を発生させます。ただし、どのような型の仮定を行っているか、適切に処理する準備ができていないケースが本当に適切な場所でエラーになるかどうかについては、まだ考える必要があります。Numpy 配列は、やみくもに依存している良い例です。len
または、ブール型キャストが期待どおりに機能しない可能性があります。
私は次のことを好みます:
if a == []:
print "The list is empty."
真理値テストに関するドキュメントから:
ここにリストされているもの以外のすべての値が考慮されますTrue
None
False
0
、などの任意の数値型のゼロ。0.0
0j
''
、などの空のシーケンス。()
[]
{}
。__bool__()
クラスがまたは__len__()
メソッドを定義している場合、そのメソッドが整数のゼロまたはブール値を返す場合、ユーザー定義クラスのインスタンスFalse
。ご覧のとおり、空のリスト[]
はfalsyであるため、ブール値に対して行われることを行うのが最も効率的です。
if not a:
print('"a" is empty!')
リストが空かどうかを確認する方法はいくつかあります。
a = [] #the list
1)非常に単純な pythonic の方法:
if not a:
print("a is empty")
Python では、リスト、タプル、セット、ディクテーション、変数などの空のコンテナーFalse
は と見なされます。リストを単純に述語 (ブール値を返す)として扱うことができます。また、True
値は空でないことを示します。
2)非常に明示的な方法: を使用しlen()
て長さを見つけ、それが に等しいかどうかを確認します0
。
if len(a) == 0:
print("a is empty")
3)または、匿名の空のリストと比較します。
if a == []:
print("a is empty")
4)もう 1 つのばかげた方法は、exception
andを使用することiter()
です。
try:
next(iter(a))
# list has elements
except StopIteration:
print("Error: a is empty")
このように使ってみることもできますbool()
。確かに読みにくいですが、これを実行するための簡潔な方法です。
a = [1,2,3];
print bool(a); # it will return True
a = [];
print bool(a); # it will return False
チェックリストが空かどうかを確認するこの方法が気に入っています。
非常に便利で便利です。