リストが空かどうかを確認するにはどうすればよいですか?


3234

たとえば、以下を渡した場合:

a = []

a空かどうかを確認するにはどうすればよいですか?

回答:


5500
if not a:
  print("List is empty")

空の暗黙のブール値を使用することlistは、かなりpythonicです。


1130
悪魔の支持者を演じます。このイディオムがpythonicと見なされる理由がわかりません。「明示的であるより暗黙的である」のですよね?このチェックは、何をチェックしているのかを明確に示していないようです。
ジェームズマクマホン

222
@JamesMcMahon-明示性と型の柔軟性の間のトレードオフです。一般に、「明示的」とは「魔法の」ことをしないことを意味します。一方、「ダックタイピング」とは、型を明示的にチェックするのではなく、より一般的なインターフェイスで作業することを意味します。のようなものif a == []は特定のタイプを強制することです(() == []is False)。ここでは、一般的なコンセンサスが(それは言って、実際にそのダックタイピングが出て勝ちのようです__nonzero__テストするためのインタフェースである虚しさdocs.python.org/reference/datamodel.html#object.__nonzero__
アンドリュー・クック

38
このメソッドはnumpy配列では機能しません。そのため、「ダックタイピング」と暗黙性の両方の観点から、len(a)== 0が望ましいかと思います。
Mr.WorshipMe

10
Cの配列が空かどうかを知るための標準的な方法は、最初の要素を逆参照し、nullで終了する配列であると想定して、それがnullかどうかを確認することです。それ以外の場合、配列の長さがかなり大きい場合、その長さをゼロと比較することはまったく非効率的です。また、通常、空の配列(ポインターはnullのまま)にメモリを割り当てないため、その長さを取得しようとしても意味がありません。私はlen(a)== 0がそれを行うための良い方法ではないことを言っているのではなく、私がそれを見たときに私に 'C'を叫ばないだけです。
sleblanc

6
@BrennenSprimont、それがnullで終了していない場合、別の長さで格納されているか、配列が長さを追跡するコンテナにラップされているかどうか、長さはわかっています。C ++、Java、C#にはそのようなコンテナーがあり、いくつかの「長さ」メソッドを効率的に実装します。Cにはそのようなものはありません。自分でロールする必要があります。静的に割り当てられたC配列は、要求したデータ量を格納するのに十分なスペースがあることが保証されているメモリスペースへの単なるポインタです。Cには、そのスペースをすでにどれだけ埋めたかを知らせるものは組み込まれていません。
sleblanc

1159

それを行うためのpythonicの方法は、PEP 8スタイルガイドからです(ここで、「はい」は「推奨」を意味し、「いいえ」は「非推奨」を意味します)。

シーケンス(文字列、リスト、タプル)の場合、空のシーケンスはfalseであるという事実を使用します。

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

49
2番目の方法はseq、ある種のリストのようなオブジェクトであると予想されることを通知する場合に適しています。
BallpointBen 2018年

5
Pythonismの擁護者が言う@BallpointBenは、変数の名前の付け方が可能な限り暗黙的であるべきです
axolotl

9
@BallpointBenは、Pythonの型ヒントを使用して、変数がどうあるべきかを通知してみます。3.5で導入されました。
ボリス

8
numpyがこのイディオムを壊しました... seq = numpy.array([1,2,3])の後にseqが続く場合、例外が発生します "ValueError:複数の要素を持つ配列の真理値があいまいです。a.anyを使用してください()またはa.all() "
Mr.WorshipMe

2
@jeronimo:lxml固有の警告だと思います。
ハーレーホルコム

768

私はそれを明示的に好みます:

if len(li) == 0:
    print('the list is empty')

このようにしてli、シーケンス(リスト)であることが100%明確であり、そのサイズをテストします。私の問題は、ブール変数if not li: ...liあるという誤った印象を与えることです。


91
リストの長さがゼロに等しいかどうかをチェックすることは、リストが偽であるかどうかだけをチェックするのではなく、醜く、Pythonのようではありません。Pythonに精通している人は誰もliまったくbool だとは思わず、気にしません。それが重要な場合は、コードではなくコメントを追加する必要があります。
カールスミス

21
これは不必要に正確なテストのように見えますが、多くの場合遅くなり、常にIMHOは読みにくくなります。空のサイズをチェックする代わりに、空かどうかをチェックしませんか?
ジョンB

34
とにかく、その理由は、これは悪いです(やPythonのような強力なイディオムと言語のイディオムに違反することは一般的に悪いことを)したいので、それはあなたが具体的に例えば、何らかの理由(のための長さをチェックしていることを読者に知らせることですNone0渡すのではなく、例外を発生させる)。あなたはだ理由もなく、ためにそれを行うときに、誤解を招く-それはまた、あなたのコードが時にすることを意味しない区別する必要性をあなたはすべてのソースの残りの部分の上に「泣いた狼」しましたので、区別は見えません。
abarnert 2014

18
これはコードを不必要に長くしているだけだと思います。それ以外の場合は、さらに「明示的」にしif bool(len(li) == 0) is True:ないでください。
オーグラ

11
@Jabba は多くの場合(組み込みのデータ型で作業する場合O(1)になりますが、それに依存することはできません。このプロパティを持たないカスタムデータ型を使用している可能性があります。このコードを既に記述した後で、このカスタムデータ型を後で追加することもできます。
ralokt 2015年

324

これは、「python test empty array」と同様のクエリに対する最初のgoogleヒットです。さらに、他の人々はリストだけでなく質問を一般化しているようですので、多くの人々が異なるタイプのシーケンスについて警告を追加すると思いました使用するかもしれません。

他のメソッドはNumPy配列では機能しません

NumPy配列では、listsまたは他の標準コンテナーで正常に機能する他のメソッドが失敗するため、NumPy配列には注意する必要があります。以下で理由を説明しますが、簡単に言うと、推奨される方法はを使用することsizeです。

「pythonic」の方法は機能しません:パート1

「pythonic」の方法は、NumPy配列で失敗します。NumPyは、配列をboolsの配列にキャストしようとし、ある種の集計真理値についてif xそれらすべてのboolsを一度に評価しようとするためです。しかし、これは意味をなさないので、次のようになります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()

「pythonic」の方法は機能しません:パート2

しかし、少なくとも上記の場合は、失敗したことを示しています。要素が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を返します。

numpythonicの方法

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このページに表示されるすべてのケースでチェックが機能します。


62
これはPythonの欠陥ではなく、意図的な契約違反numpy- numpyは非常に特定のユースケースを持つライブラリであり、配列に対する真実性が異なるという「自然な」定義があります。コンテナーのPython標準。の代わりにをpathlib使用/してパスを連結する方法で、そのような場合に最適化すること+は理にかなっています。これは非標準ですが、コンテキストでは理にかなっています。
Gareth Latty、2015

9
同意した。私の要点は、非常に一般的なものif xlen(x)慣用句の両方でnumpyがアヒルの入力を中断することを選択したことを覚えておくことが重要であるということです。
マイク

22
私にとって、仮定のためにlen(x)と呼ばれるメソッドが配列の長さを返さない場合、その名前は正しく設計されていません。
ダルトン

11
この質問は、
派手な

19
@ppperryはい、元の質問はNumpy配列に関するものではありませんでしたが、それらおよびおそらくダック型の引数を操作する場合、この質問は非常に関連性があります。
peterhil

223

リストが空かどうかを確認する最良の方法

たとえば、以下を渡した場合:

a = []

が空かどうかを確認するにはどうすればよいですか?

簡潔な答え:

リストをブールコンテキストに配置します(たとえば、ifor whileステートメントを使用)。False空かどうかをテストしTrueます。例えば:

if not a:                           # do this!
    print('a is an empty list')

PEP 8

Pythonの標準ライブラリにあるPythonコードの公式PythonスタイルガイドであるPEP 8は、次のように主張しています。

シーケンス(文字列、リスト、タプル)の場合、空のシーケンスはfalseであるという事実を使用します。

Yes: if not seq:
     if seq:

No: if len(seq):
    if not len(seq):

標準ライブラリのコードは、できるだけ高性能で正しいものである必要があります。しかし、なぜそうなのか、そしてなぜこのガイダンスが必要なのか?

説明

Pythonに慣れていない経験豊富なプログラマーから、次のようなコードがよく見られます。

if len(a) == 0:                     # Don't do this!
    print('a is an empty list')

そして、怠惰な言語のユーザーはこれをしたくなるかもしれません:

if a == []:                         # Don't do this!
    print('a is an empty list')

これらは、それぞれ他の言語で正しいです。そして、これはPythonでも意味的に正しいです。

ただし、Pythonはブール型強制を介してリストオブジェクトのインターフェースで直接これらのセマンティクスをサポートしているため、Pythonではないものと見なします。

ドキュメントから(そして空のリストが含まれていることに特に注意してください[]):

デフォルトでは、オブジェクトで呼び出されたときに、そのクラス__bool__()が返すメソッドFalseまたは__len__()ゼロを返すメソッドのいずれかをクラスで定義しない限り、オブジェクトはtrueと見なされます。以下は、falseと見なされる組み込みオブジェクトのほとんどです。

  • false Noneと定義された定数:およびFalse
  • 任意の数値型のゼロ:00.00jDecimal(0)Fraction(0, 1)
  • 空のシーケンスやコレクション:''()[]{}set()range(0)

そして、データモデルのドキュメント:

object.__bool__(self)

真理値テストと組み込み操作を実装するために呼び出されbool()ます。Falseまたはを返す必要がありTrueます。このメソッドが定義されていない __len__()場合、それが定義されていればが呼び出され、その結果がゼロ以外であればオブジェクトはtrueと見なされます。クラスがもも定義してい__len__() ない場合、__bool__()そのインスタンスはすべてtrueと見なされます。

そして

object.__len__(self)

組み込み関数を実装するために呼び出されますlen()。オブジェクトの長さ、0以上の整数を返す必要があります。また、__bool__()メソッドを定義せず、__len__()メソッドがゼロを返すオブジェクトは、ブール値のコンテキストではfalseと見なされます。

したがって、これの代わりに:

if len(a) == 0:                     # Don't do this!
    print('a is an empty list')

またはこれ:

if a == []:                     # Don't do this!
    print('a is an empty list')

これを行う:

if not a:
    print('a is an empty list')

Pythonicを実行すると、通常はパフォーマンスが向上します。

それは報われますか?(同等の操作を実行する時間は少ない方がよいことに注意してください:)

>>> import timeit
>>> min(timeit.repeat(lambda: len([]) == 0, repeat=100))
0.13775854044661884
>>> min(timeit.repeat(lambda: [] == [], repeat=100))
0.0984637276455409
>>> min(timeit.repeat(lambda: not [], repeat=100))
0.07878462291455435

規模については、関数を呼び出して空のリストを作成して返すコストは次のとおりです。これは、上記で使用された空性チェックのコストから差し引くことができます。

>>> min(timeit.repeat(lambda: [], repeat=100))
0.07074015751817342

私たちは、ことがわかりいずれかの組み込み機能を備えた長さの確認lenに比べ0 または空のリストと照合がある多くの文書化されているように、言語の組み込みの構文を使用して、より少ないパフォーマンス。

どうして?

以下のためのlen(a) == 0チェック:

最初のPythonは、グローバルlenがシャドウされているかどうかを確認する必要があります。

次に、関数を呼び出してロードし0、Pythonで等価比較を行う必要があります(Cの代わりに)。

>>> import dis
>>> dis.dis(lambda: len([]) == 0)
  1           0 LOAD_GLOBAL              0 (len)
              2 BUILD_LIST               0
              4 CALL_FUNCTION            1
              6 LOAD_CONST               1 (0)
              8 COMPARE_OP               2 (==)
             10 RETURN_VALUE

そして、[] == []それは不必要なリストを構築しなければならず、それから再び、(Cとは対照的に)Pythonの仮想マシンで比較操作を行います

>>> dis.dis(lambda: [] == [])
  1           0 BUILD_LIST               0
              2 BUILD_LIST               0
              4 COMPARE_OP               2 (==)
              6 RETURN_VALUE

リストの長さがオブジェクトインスタンスヘッダーにキャッシュされるため、「Pythonic」の方法ははるかに単純で高速なチェックです。

>>> dis.dis(lambda: not [])
  1           0 BUILD_LIST               0
              2 UNARY_NOT
              4 RETURN_VALUE

Cソースとドキュメントからの証拠

PyVarObject

これはPyObjectob_sizeフィールドを追加するの拡張です。これは、長さの概念を持つオブジェクトにのみ使用されます。このタイプは、Python / C APIではあまり表示されません。PyObject_VAR_HEADマクロの展開で定義されたフィールドに対応します。

Include / listobject.hの Cソースから:

typedef struct {
    PyObject_VAR_HEAD
    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size

コメントへの応答:

私は、これはのようにそのかなり醜いしかし、空でない場合についても同様であることを指摘うl=[]その後、%timeit len(l) != 090.6ナノ秒±8.3ナノ秒、%timeit l != []55.6ナノ秒±3.09、%timeit not not l38.5ナノ秒±0.372。しかしnot not l、3倍の速度にもかかわらず、誰もが楽しむことはできません。ばかげて見えます。しかし、速度は勝つ
と思います。問題は時間でテストしているだけだと思います。これif l:は十分なこと%timeit bool(l)ですが、驚くほど101 ns±2.64 nsです。興味深いことに、このペナルティなしにブールを強制する方法はありません。%timeit l変換が行われないため、役に立たない。

IPythonマジックは%timeit、ここでは完全に役に立たないわけではありません。

In [1]: l = []                                                                  

In [2]: %timeit l                                                               
20 ns ± 0.155 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

In [3]: %timeit not l                                                           
24.4 ns ± 1.58 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [4]: %timeit not not l                                                       
30.1 ns ± 2.16 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

notここで追加ごとに少し線形コストがあることがわかります。私たちはコスト、ceteris paribus、つまり他のすべてが等しい-他のすべてが可能な限り最小化されているところを見たいです:

In [5]: %timeit if l: pass                                                      
22.6 ns ± 0.963 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [6]: %timeit if not l: pass                                                  
24.4 ns ± 0.796 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [7]: %timeit if not not l: pass                                              
23.4 ns ± 0.793 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

次に、空でないリストのケースを見てみましょう。

In [8]: l = [1]                                                                 

In [9]: %timeit if l: pass                                                      
23.7 ns ± 1.06 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [10]: %timeit if not l: pass                                                 
23.6 ns ± 1.64 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [11]: %timeit if not not l: pass                                             
26.3 ns ± 1 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

ここでわかるのは、実際boolに条件チェックに渡しても、リスト自体に渡してもほとんど違いがなく、どちらかと言えば、リストをそのまま渡す方が速いということです。

PythonはCで書かれています。Cレベルでロジックを使用します。Pythonで書くものはすべて遅くなります。また、Pythonに直接組み込まれているメカニズムを使用している場合を除き、速度はおそらく桁違いに遅くなります。


私は、これはのようにそのかなり醜いしかし、空でない場合についても同様であることを指摘うl=[]その後、%timeit len(l) != 090.6ナノ秒±8.3ナノ秒、%timeit l != []55.6ナノ秒±3.09、%timeit not not l38.5ナノ秒±0.372。しかしnot not l、3倍の速度にもかかわらず、誰もが楽しむことはできません。ばかげて見えます。しかし、速度は勝つ
グレゴリーモース

問題はtimeitでテストしていると思います。これif l:は十分ですが、驚くべきことに%timeit bool(l)101 ns±2.64 nsです。興味深いことに、このペナルティなしにブールを強制する方法はありません。 %timeit l変換が行われないため、役に立たない。
グレゴリーモース

138

空のリストは、それ自体が真の値のテストでfalseと見なされます(pythonのドキュメントを参照)。

a = []
if a:
     print "not empty"

@ダレン・トーマス

編集:空のリストをFalseとしてテストすることに対するもう1つのポイント:ポリモーフィズムはどうですか?リストがリストであることに依存すべきではありません。それはアヒルのようにいちゃつくべきです-それが要素を持たないとき、どのようにあなたのduckCollectionを '' False ''をいじくりますか?

あなたのduckCollectionは実装する__nonzero__必要があります__len__ので、a:ifは問題なく動作します。


奇妙なこと[] == Falseに、Falseと評価される
information_interchange

@information_interchange値の真偽を明示的に確認したい場合は、を使用してくださいbool()。 期待どおりにbool([]) == False評価Trueされます。
augurar

103

Patrickの(承認された)答えは正しいですif not a:。正しい方法です。Harley Holcombeの答えは、これがPEP 8スタイルガイドにあることです。しかし、答えがどれも説明しないのは、たとえイディオムに従うのが良い考えである理由です。たとえ個人的にそれが十分に明示的ではなく、Rubyユーザーなどにとって混乱している場合でもです。

PythonコードとPythonコミュニティには、非常に強力なイディオムがあります。これらの慣用句に従うと、Pythonの経験者にとってコードが読みやすくなります。そして、それらのイディオムに違反するとき、それは強いシグナルです。

それは事実ですif not a:から、空のリストを区別していないNone、または数値0、または空のタプル、または空のユーザが作成したコレクション型、または空のユーザーが作成していない-かなり-コレクション型、または単一要素numpyの配列はfalseyとスカラとして働きます値など。そして、それについて明示することが重要な場合があります。その場合は、を明示したいがわかっているので、それを正確にテストできます。たとえば、if not a and a is not None:「None以外の誤ったもの」をif len(a) != 0:意味し、「空のシーケンスのみ。シーケンス以外のエラーはここではエラーです」などを意味します。これは、テストしたいものを正確にテストすることに加えて、このテストが重要であることを読者に知らせます。

しかし、明確にする必要のあるものが何もない場合if not a:、読者を誤解させる以外の何かが必要です。それが重要ではないときに重要なことを伝えています。(また、柔軟性の低い、あるいはより遅く、または何が、すべての重要度の低いのコードを作成することができる。)そして、あなたがあれば常習的に使用すると、ときに、次のように読者を欺く行う区別する必要があると、見過ごさ理由を渡すために起こっていますコード全体で「オオカミを泣いている」。


78

なぜチェックするの?

そもそもリストをテストする必要性を問うことに誰も対処していないようです。追加のコンテキストを提供しなかったので、最初にこのチェックを行う必要はないかもしれませんが、Pythonでのリスト処理に慣れていない可能性があります。

最もパイソン的な方法は、まったくチェックしないで、リストを処理するだけであると私は主張します。そうすれば、それは空であろうと満杯であろうと正しいことをします。

a = []

for item in a:
    <do something with item>

<rest of code>

これは、任意の内容の取り扱いの利点がある空虚のための具体的なチェックを必要としないながらに、。場合は空で、依存ブロックは実行されませんし、インタプリタは次の行に通じ分類されます。

空の配列を実際に確認する必要がある場合は、他の回答で十分です。


3
少なくとも、私にとっては、リストが空かどうかを確認することが非常に重要です。ループの<rest of code>結果を使用する可能性のあるスクリプトが内部にあるかどうか考えましたかfor?または直接いくつかの値を使用しaますか?実際、スクリプトが厳密に制御された入力で実行されるように設計されている場合、チェックは少し不要になる可能性があります。しかし、ほとんどの場合、入力は異なり、通常はチェックする方が優れています。
AmarthGûl2018

敬具、いいえ。私が検討したのは、「if <list>:」が正解であることをPythonについて十分に知らない人で、空のリストを確認する方法を尋ねました。その後、さまざまな意見を提供する多くの回答に気づきましたが、元のニーズに対応しているようには見えませんでした。それが私が私の答えでやろうとしたことです—続行する前に彼らに必要性を調べてもらいます。私ははっきりと私の答えで多くを提案したと思います。
MrWonderful 2018

@AmarthGûl -どのようにしてあります取得ループ用のスクリプト内の<コードの残りの部分>への結果を処理しますか?リストでは、たぶん?それとも辞書?その場合、同じロジックが適用されます。空のリストを処理することは悪い考えである、合理的に設計されたあらゆる種類のコード内で、変数の入力がどのように影響するか理解していません。
MrWonderful

少し古いですが、リストが空であるかどうかを確認しているだけの場合、空でないリストの場合、OPが単にチェック操作を探しているときに、コードはプロセスを何度も繰り返します。nが無限大に近づくにつれてわずか....そのコードのための最悪のシナリオを想像
DJK

7
@DJK-いいえ、まだ見逃しているようです。もしあれば、リストを使って何かをしたいと思うでしょう。空の場合はどうしますか?早く帰る?空でない場合はどうなりますか?それを処理しますか?ポイントは、それでも、おそらく空のリストをチェックする必要はなく、単にそれを反復処理して、要素に対して行うつもりなら何でもすることです。要素がない場合は、失敗します。要素がある場合は、必要に応じて処理します。ポイントは、空のチェックの例を使用するのではなく、リストを処理するだけで、まったくチェックしないことです。
MrWonderful


40

私は書いた:

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 または、ブール型キャストが期待どおりに動作しない場合があります。


3
受け入れる必要があり、他のタイプに対して柔軟性を持たせたくない6つのタイプの完全なリストを作成することは非常にまれです。そのようなものが必要なときは、おそらくABCが必要です。この場合、おそらく、collections.abc.Sizedまたはのようなstdlib ABCのcollections.abc.Sequence1つですが、自分で書いたものである可能性もありますregister(list)。空を他の誤ったものと区別し、リストとタプルを他のシーケンスと区別することが重要なコードが実際にある場合、これは正しいですが、そのようなコードがあるとは思いません。
abarnert 14

13
人々がこれを好まない理由は、ほとんどの場合それが完全に不必要だからです。Pythonはアヒル型の言語であり、このレベルの防御的コーディングは積極的にそれを妨げます。Pythonの型システムの背後にある考え方は、オブジェクトが必要な方法で関数に渡される限り、物事は機能するということです。明示的な型チェックを行うことにより、呼び出し元に特定の型を使用するように強制し、言語の粒度に反することになります。時々そのようなことが必要ですが(文字列がシーケンスとして扱われるのを除外する)、そのようなケースはまれで、ほとんどの場合ブラックリストとして最適です。
Gareth Latty、2015

1
値が正確にチェックされ、[]別のタイプの問題ではないことを本当に確認したい場合は、isinstanceをいじるのでif a == []:はなく、確実に呼び出されます。
RemcoGerlich、2015

2
==ただし、いくつかの自動強制があります。頭上では、を特定できません[][] == ()たとえばを返しますFalse。しかし、例えばfrozenset()==set()戻りますTrue。したがって、を実行するときに、いくつかの望ましくない型が強制される[](またはその逆)可能性があるかどうかについて少なくとも検討する価値がありますa == []
dubiousjim 2015

@RemcoGerlich-比較する空のリストを作成するのではなく、isinstance()を使用することをお勧めします。また、別の指摘によると、等値演算子は一部の型の暗黙の変換を呼び出す可能性があり、これは望ましくない場合があります。「a == []」をコード化する理由はありません。そのコードは、私が参加したコードレビューで間違いとして欠陥として報告されます。言語で提供されている適切なツールを使用することは、 」ではなく、「優れたプログラミング手法」です。
MrWonderful 2018年

29

真理値テストに関するドキュメントから:

ここにリストされているもの以外のすべての値が考慮されます True

  • None
  • False
  • 例えば、任意の数値型のゼロ、00.00j
  • 例えば、任意の空のシーケンス、''()[]
  • 空のマッピング(例:){}
  • クラスが__bool__()or __len__()メソッドを定義している場合、そのメソッドが整数のゼロまたはブール値を返すとき、ユーザー定義クラスのインスタンスFalse

見てわかるように、空のリスト[]であるので、ブール値に対して行われることを行うことが最も効率的に聞こえます。

if not a:
    print('"a" is empty!')

@DJ_Stuffy_Kは、ユニットテストで空のリストをアサートしますか?だけを使用してくださいassert(not myList)。オブジェクトがであることも表明したい場合はlist、を使用できますassertIsInstance()
Sнаđошƒаӽ

24

リストが空かどうかを確認する方法はいくつかあります。

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つの馬鹿げた方法は、exceptionand を使用することですiter()

try:
    next(iter(a))
    # list has elements
except StopIteration:
    print("Error: a is empty")

20

私は以下を好む:

if a == []:
   print "The list is empty."

37
余分な空のリストを不必要にインスタンス化するため、これは遅くなります。
カールマイヤー

32
これは読みにくくif not a:、壊れやすくなります。しないでください。
devsnd

以前に作成された良い点() == []もfalseに等しいです。この実装if not a:がすべてのケースをカバーする方法を読むのが好きですが、リストを確実に期待している場合は、例で十分です。
スター

19

方法1(推奨):

if not a : 
   print ("Empty") 

方法2:

if len(a) == 0 :
   print( "Empty" )

方法3:

if a == [] :
  print ("Empty")

12
def list_test (L):
    if   L is None  : print('list is None')
    elif not L      : print('list is empty')
    else: print('list has %d elements' % len(L))

list_test(None)
list_test([])
list_test([1,2,3])

None空と空を別々にテストすることは、2つの異なる状態であるため、時々良いことです。上記のコードは次の出力を生成します。

list is None 
list is empty 
list has 3 elements

それNoneは偽って何の価値もありませんが。したがって、None-nessのテストを分離したくない場合は、それを行う必要はありません。

def list_test2 (L):
    if not L      : print('list is empty')
    else: print('list has %d elements' % len(L))

list_test2(None)
list_test2([])
list_test2([1,2,3])

期待される

list is empty
list is empty
list has 3 elements

8

多くの答えが出されており、それらの多くはかなり良いです。チェックを追加したかっただけ

not a

None他のタイプの空の構造体も渡されます。空のリストを本当に確認したい場合は、次のようにします。

if isinstance(a, list) and len(a)==0:
    print("Received an empty list")

aリストでaなく、メソッドが__len__実装されていない場合、例外がスローされる可能性があります。私はお勧めします:if isinstance(obj, list): if len(obj) == 0: print '...'
SvenKrüger19年

4
@SvenKrügerいいえ。演算子andはPythonでは怠惰です。andbeforeの条件andがFalseの場合、after は実行されません。
-ElmoVanKielmo

7

それ以外の場合は、シンプルなものを使用できます。

item_list=[]
if len(item_list) == 0:
    print("list is empty")
else:
    print("list is not empty")

5
-1-混乱を避けるために、変数名に予約語を使用しないでください。そうすると、次に呼び出そうとしたときに予期しない動作が発生する可能性があります。たとえば、「list()」...「TypeError: 'list' object is like呼び出せない」など。
MrWonderful

6

リストが空かどうかを確認する場合:

l = []
if l:
    # do your stuff.

リストのすべての値が空かどうかを確認する場合。ただしTrue、空のリストの場合は次のようになります。

l = ["", False, 0, '', [], {}, ()]
if all(bool(x) for x in l):
    # do your stuff.

両方のケースを一緒に使用する場合:

def empty_list(lst):
    if len(lst) == 0:
        return False
    else:
        return all(bool(x) for x in l)

今あなたは使うことができます:

if empty_list(lst):
    # do your stuff.

1
空のリストの場合、all(bool(x)for x in l)はTrueです
gberger

5

@dubiousjimのソリューションに触発されて、私はそれが反復可能かどうかの追加の一般的なチェックを使用することを提案します

import collections
def is_empty(a):
    return not a and isinstance(a, collections.Iterable)

注:文字列は反復可能と見なされます。- and not isinstance(a,(str,unicode))空の文字列を除外する場合は追加します

テスト:

>>> is_empty('sss')
False
>>> is_empty(555)
False
>>> is_empty(0)
False
>>> is_empty('')
True
>>> is_empty([3])
False
>>> is_empty([])
True
>>> is_empty({})
True
>>> is_empty(())
True

1
海外; これは、リストが空であるかどうかを尋ねるだけであり、何かが空の反復可能オブジェクトであるかどうかではありません。
pppery 2017

1
に満足できなかったのはif a:aなんらかのコンテナでない場合に例外が必要だったからです。(イテラブルであることにより、イテレーターも許可されますが、空かどうかをテストすることはできません。)
Davis Herring


4

python3以降から使用できます

a == []

リストが空かどうかを確認するには

編集:これはpython2.7でも動作します。

なぜこんなに複雑な答えがあるのか​​わかりません。それはかなり明確で簡単です


1
「if」を書かずに、それがどのように機能するかについてより多くの説明を与えてください。
ganeshdeshmukh 2018

3
これはpythonicでも完全な例でもありません。また、遭遇するたびに空のリストをインスタンス化します。これを行わないでください。
MrWonderful

@MrWonderful毎回空のリストをインスタンス化するわけではありません。既存のリストaが空かどうかを確認するだけです。
Tessaracter

@MrWonderful何が原因なのかわかりませんpythonic
Tessaracter

@ganeshdeshmukhを使用a==[]すると、aが空の場合、Python端末でtrueが出力されます。そうでない場合は、Falseと出力されます。これはif条件の内部でも使用できますif(a==[])
Tessaracter

3

このようにbool()を使用することもできます

    a = [1,2,3];
    print bool(a); # it will return True
    a = [];
    print bool(a); # it will return False

リストが空かどうかを確認するためのこの方法が大好きです。

とても便利で便利です。


4
知らない人(私のように)はbool()、Python変数をブール値に変換して、ifステートメントを使用せずに値の真偽保存できるようにします。受け入れられた回答のような条件付きのものを使用するよりは読みにくいと思いますが、他にも良いユースケースがあると思います。
Galen Long

これは式で使用でき、より簡潔です。
qneill

3

is_empty()を使用するか、次のような関数を作成します。

def is_empty(any_structure):
    if any_structure:
        print('Structure is not empty.')
        return True
    else:
        print('Structure is empty.')
        return False  

リスト、タプル、辞書など、あらゆるdata_structureに使用できます。これらにより、だけで何度も呼び出すことができますis_empty(any_structure)


3
名前is_emptyは何かを返すことを示唆しています。しかし、もしそうなら、それは単にでありbool(any_structure)、代わりに使用する必要があります(必要な場合bool)。
Davis Herring

4
なぜboolメッセージを標準出力に出力する(また)バリエーションが必要なのですか?
Davis Herring

@DavisHerring常に2つの選択肢がありboolます。まず最初に、関数を使用して印刷するか、その他は戻り変数を使用します。選択はあなた次第です。両方を書くので、どちらかを選択できます。
Vineet Jain 2017



1

ここで私を連れてきたのは特別なユースケースです。実際には、リストが空かどうかを関数に通知したかったのです。ここでは、独自の関数を記述したり、ラムダ式を使用したりしないようにしたかったので(十分に単純であるように見えたため)、

foo = itertools.takewhile(is_not_empty, (f(x) for x in itertools.count(1)))

そしてもちろん、それを行う非常に自然な方法があります。

foo = itertools.takewhile(bool, (f(x) for x in itertools.count(1)))

もちろん、暗黙のうちに(つまり)で使用しないでください。ただし、「空でない」が関数として明示的に必要な場合は、これが最良の選択です。boolifif bool(L):bool


1

リストが空かどうかを確認するには、次の2つの方法を使用できます。ただし、シーケンスのタイプを明示的にチェックする方法は回避する必要があります(それはless pythonic方法です)。

def enquiry(list1): 
    if len(list1) == 0: 
        return 0
    else: 
        return 1

# ––––––––––––––––––––––––––––––––

list1 = [] 

if enquiry(list1): 
    print ("The list isn't empty") 
else: 
    print("The list is Empty") 

# Result: "The list is Empty".

2番目の方法はmore pythonic1つです。この方法は暗黙的なチェック方法であり、以前の方法よりもはるかに望ましい方法です。

def enquiry(list1): 
    if not list1: 
        return True
    else: 
        return False

# ––––––––––––––––––––––––––––––––

list1 = [] 

if enquiry(list1): 
    print ("The list is Empty") 
else: 
    print ("The list isn't empty") 

# Result: "The list is Empty"

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.