我正在尝试检查字典是否为空但它的行为不正常。 除了显示消息之外,它只是跳过它并显示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())) 

===============>>#1 票数:601 已采纳

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()))

===============>>#2 票数:102

以下三种方法可以检查dict是否为空。 我更喜欢使用第一种方式。 另外两种方式太过于罗嗦。

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"

===============>>#3 票数:12

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

如果length为零则表示dict为空

===============>>#4 票数:0

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")

===============>>#5 票数:0

检查空字典的简单方法如下:

        a= {}

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

虽然方法1st比a = None时更严格,但方法1将提供正确的结果,但方法2将给出不正确的结果。

===============>>#6 票数:0

字典可以自动转换为boolean,对于空字典,其值为False ,对于非空字典,则为True

if myDictionary: non_empty_clause()
else: empty_clause()

如果这看起来过于惯用,你也可以测试len(myDictionary)为零,或者set(myDictionary.keys())为空集,或者只是测试与{}相等性。

isEmpty函数不仅是不必要的,而且你的实现有多个问题,我可以初步看到。

  1. return False语句缩进一级太深。 它应该在for循环之外并且与for语句处于同一级别。 因此,如果存在密钥,您的代码将只处理一个任意选择的密钥。 如果某个键不存在,该函数将返回None ,它将被转换为boolean False。 哎哟! 所有空字典都将被归类为假字典。
  2. 如果字典不为空,则代码将仅处理一个键并将其值返回到布尔值。 您甚至不能假设每次调用时都会评估相同的密钥。 所以会有误报。
  3. 我们假设您更正了return False语句的缩进并将其置于for循环之外。 然后得到的是所有键的布尔OR ,如果字典为空则为False 你仍然会有误报和漏报。 对以下字典进行更正和测试以获取证据。

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

===============>>#7 票数:-1

你也可以使用get()。 最初我认为它只检查密钥是否存在。

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

我喜欢得到的是它不会触发异常,所以它可以很容易地遍历大型结构。

===============>>#8 票数:-4

为什么不使用平等测试?

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

===============>>#9 票数:-7

使用'任何'

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

  ask by Unsparing translate from so

未解决问题?本站智能推荐: