Python: 'Dictionary'が空かどうかの確認が機能しないようです


396

辞書が空かどうかを確認しようとしていますが、正しく動作しません。メッセージを表示するだけで、それをスキップしてONLINEを表示します。なぜアイデアですか?

 def isEmpty(self, dictionary):
   for element in dictionary:
     if element:
       return True
     return False

 def onMessage(self, socket, message):
  if self.isEmpty(self.users) == False:
     socket.send("Nobody is online, please use REGISTER command" \
                 " in order to register into the server")
  else:
     socket.send("ONLINE " + ' ' .join(self.users.keys())) 

6
self.usersが空でないかどうかを確認するには、を実行しますif self.users
BrenBarn 2014

4
あなたは、isEmpty実際に返すTrue辞書から得られた最初のキーがtrueyとリターンがある場合はFalseそうでありません。辞書が空の場合、それはNoneを返します== False
Hyperboreus 14

あなたのifステートメントは逆です。
Mad Physicist

偽のようなキーに注意してくださいstackoverflow.com/a/17347421/1379762
Wajih

回答:


737

空の辞書はPythonで評価さFalseれます:

>>> dct = {}
>>> bool(dct)
False
>>> not dct
True
>>>

したがって、isEmpty関数は不要です。あなたがする必要があるのは:

def onMessage(self, socket, message):
    if not self.users:
        socket.send("Nobody is online, please use REGISTER command" \
                    " in order to register into the server")
    else:
        socket.send("ONLINE " + ' ' .join(self.users.keys()))

7
リンクした@Wajihは無関係です。bool({False: False})まだと評価されTrueます。あなたが与えたリンクanyはキーに依存するメソッドに対応しています。
Ulysse BN

@Wajihどういう意味ですか?
チャーリーパーカー


同意しました、私はブール値を使用したいのnot <dict>ですが、あまり明確ではありません
cryanbhu

130

dictが空かどうかを確認する方法は3つあります。ただし、最初の方法のみを使用することをお勧めします。他の2つの方法は非常に冗長です。

test_dict = {}

if not test_dict:
    print "Dict is Empty"


if not bool(test_dict):
    print "Dict is Empty"


if len(test_dict) == 0:
    print "Dict is Empty"

44
ため息...誰もが「パイソン風」であることが好きで、最小限の文字をタイプするようにしています。まず、別の基準は読みやすさです。次に、上記の回答の最初のテストは、dictが存在して空の場合だけでなく、test_dictがNoneの場合にも当てはまります。したがって、このテストは、dictオブジェクトが存在することがわかっている場合(または違いが問題にならない場合)にのみ使用してください。2番目の方法にもその動作があります。test_dictがNoneの場合、3番目の方法のみが吠えます。
Andreas Maier

1
@AndreasMaierまさに私の気持ちでもあります。また、Pythonは動的に型付けされます。関数内では、「xが空でないディクショナリの場合はこれを実行し、xが空でないnumpy配列の場合はそれを実行する」ことを確認するのが一般的です。次に、if xxがnumpy配列の場合、最初のコードは失敗します
jf328

1
@Wajihあなたのリンクはここではまだ関係ありません... 理由を
Ulysse BN

1
私が共有する懸念のため技術的に正しいが、これを支持しない。@AndreasMaier
Stunner

16
dict = {}
print(len(dict.keys()))

長さがゼロの場合、dictが空であることを意味します


3
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の質を高めるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
DimaSan

1
len(dict.keys())に相当len(dict)
pdpAxis

@pdpAxisの値では、実装dict.__len__はおそらく少し速いと思いますが。:)
Mateen Ulhaq

6

空の辞書をチェックする簡単な方法は以下の通りです:

        a= {}

    1. if a == {}:
           print ('empty dict')
    2. if not a:
           print ('empty dict')

a = Noneの場合のようにメソッド1stはより厳密ですが、メソッド1は正しい結果を提供しますが、メソッド2は誤った結果を提供します。


1

辞書はブール値に自動的にキャストできFalse、空の辞書と空でない辞書を評価しTrueます。

if myDictionary: non_empty_clause()
else: empty_clause()

これがあまりにも慣用的に見える場合はlen(myDictionary)、ゼロまたはset(myDictionary.keys())空のセットをテストするか、単にと等しいかどうかをテストすることもできます{}

isEmpty関数は不必要であるだけでなく、実装にも複数の問題があり、一見してわかります。

  1. return Falseステートメントが深すぎる1つのレベルにインデントされます。これは、forループの外側で、forステートメントと同じレベルにある必要があります。その結果、キーが存在する場合、コードは任意に選択された1つのキーのみを処理します。キーが存在しない場合、関数はを返しNone、ブール値のFalseにキャストされます。痛い!空の辞書はすべて偽陰性として分類されます。
  2. 辞書が空でない場合、コードは1つのキーのみを処理し、その値キャストをブール値に返します。同じキーが呼び出されるたびに評価されるとは限りません。したがって、誤検知があります。
  3. return Falseステートメントのインデントを修正して、forループの外に移動したとします。次に、すべてのキーのブールOR、またはFalse辞書が空の場合に取得されます。それでも、偽陽性と偽陰性があります。修正を行い、次の辞書に対して証拠をテストします。

myDictionary={0:'zero', '':'Empty string', None:'None value', False:'Boolean False value', ():'Empty tuple'}


-1

get()を使用することもできます。最初は、キーが存在するかどうかをチェックするだけだと思っていました。

>>> d = { 'a':1, 'b':2, 'c':{}}
>>> bool(d.get('c'))
False
>>> d['c']['e']=1
>>> bool(d.get('c'))
True

getで私が気に入っているのは、例外をトリガーしないため、大きな構造を簡単にトラバースできることです。


-4

同等性テストを使用しないのはなぜですか?

def is_empty(my_dict):
    """
    Print true if given dictionary is empty
    """
    if my_dict == {}:
        print("Dict is empty !")

これは構文エラーのように見え、質問のコンテキストでチェックを適用する方法は示していません。
Roland Weber

-7

「任意」を使用

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
anydictに真実のキーが含まれているかどうかをチェックします。たとえば、dictが空でなくてもany({0: 'something'})戻るFalse
Railslide

そうです、真実と空白の両方のケースから救うために、他の賢明なブールは真実のケースに真実を与えたでしょう。あなたが一般的なコーディングの目的で考える場合。
chhotu sardar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.