python シーケンス・コレクションが空であるか判定する方法

シーケンス・コレクションが空であるか判定する方法を説明します。

シーケンス・コレクションが空であるか判定

空のシーケンス・コレクションは偽と判定されます。
下記にコードを示します。

#""
str_false = ''
if str_false:
    print("True str")
else:
    print("False str")

#()
tupple_false = ()
if tupple_false:
    print("True tupple")
else:
    print("False tupple")

#[]
list_false = []
if list_false:
    print("True list")
else:
    print("False list")

#{}
dict_false = {}
if dict_false:
    print("True dict")
else:
    print("False dict")

#set()
set_false = set()
if set_false:
    print("True set()")
else:
    print("False set()")

#range(0)
range_false = set()
if range_false:
    print("True range(0)")
else:
    print("False range(0)")

"""出力
False str
False tupple
False list
False dict
False set()
False range(0)
"""

空のシーケンスまたはコレクションは偽となることが、公式ドキュメントに書かれています。

主な組み込みオブジェクトで偽と判定されるものを次に示します:

・偽であると定義されている定数: None と False
・数値型におけるゼロ: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
・空のシーケンスまたはコレクション: ”, (), [], {}, set(), range(0)

https://docs.python.org/ja/3/library/stdtypes.html#truth-value-testing、真理値判定

その他オブジェクトが空であるか判定 判定

前提知識

クラスが__bool__()、__len__()を定義している場合、その結果によりオブジェクトが偽であるか判定できることが、公式ドキュメントからわかります。

どのようなオブジェクトでも真理値として判定でき、 if や while の条件あるいは以下のブール演算の被演算子として使えます。

オブジェクトは、デフォルトでは真と判定されます。ただしそのクラスが __bool__() メソッドを定義していて、それが False を返す場合、または __len__() メソッドを定義していて、それが 0 を返す場合は偽と判定されます。

https://docs.python.org/ja/3/library/stdtypes.html#truth-value-testing、真理値判定

下記、__len()__の説明です。__len__()が0を返すようなオブジェクトは偽とみなされます。

呼び出して組み込み関数 len() を実装します。 オブジェクトの長さを 0 以上の整数で返さなければなりません。 また、 __bool__() メソッドを定義しておらず、 __len__() メソッドが 0 を返すようなオブジェクトは、ブール演算コンテキストでは偽とみなされます。

https://docs.python.org/ja/3/reference/datamodel.html#object.len

方法

collectionsモジュールのdequeクラスが空であるか判定する方法を示します[1]。
dequeクラス以外のドキュメントに記載が無いクラスについても、__len__()が定義されていれば、dequeと同様の方法で空であるか判定することができます。

まず、__bool__()、__len__ () がクラスに定義されているか調べます。dequeの場合は、__len__()が定義されています(Visual Studio Codeの予測変換で確認)。

__len__()が定義されている場合、「 _len__()が0を返すようなオブジェクトは偽 」となります。つまり、dequeオブジェクトの要素数が0であれば偽です。
ですので、下記コードの様に、判定することができます。

import collections

queue = collections.deque()
print(queue.__len__())

if queue:
    print("true")
else:
    print("false")

"""出力
0
false
"""

参考

[1]How to check if a deque is empty https://stackoverflow.com/questions/5652278/how-to-check-if-a-deque-is-empty
下記リンクのコメントが参考になります。deuqueの様に空であれば偽と判定される性質は、全てのcollectionsで共通であると述べられています(collectionsはモジュール名のことだと思います)。
https://stackoverflow.com/a/5652291/4203048

コメント

タイトルとURLをコピーしました