web-dev-qa-db-ja.com

Python:「辞書」が空かどうか調べるのはうまくいかないようです

辞書が空かどうかを調べようとしていますが、正しく動作しません。それは単にそれをスキップしてメッセージを表示する以外何もせずに _ 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())) 
271
Unsparing

空の辞書 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()))
539
iCodez

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"
91
doubleo
dict = {}
print(len(dict.keys()))

長さがゼロの場合、辞書は空です。

辞書は自動的にブール値にキャストされ、空の辞書の場合は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ループの外側に持ってくるとしましょう。そうすると、すべてのキーのブール値 _または_ 、あるいは辞書が空の場合はFalseが得られます。それでもあなたは誤検知と誤検知をするでしょう。証拠を得るために以下の辞書に対して修正とテストをしてください。

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

0
Della

Python 3:

def is_empty(dict):
   if not bool(dict):
      return True
   return False

test_dict = {}
if is_empty(test_dict):
    print("1")

test_dict = {"a":123}
if not is_empty(test_dict):
    print("1")
0
Luís De Marchi

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

        a= {}

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

方法1は、a = Noneの場合よりも厳密ですが、方法1では正しい結果が得られますが、方法2では誤った結果が得られます。

0
Shagun Pruthi