Python:检查'Dictionary'是否为空似乎不起作用

时间:2014-04-20 01:29:19

标签: python dictionary

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

10 个答案:

答案 0 :(得分:551)

Python中的空字典evaluate to 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()))

答案 1 :(得分:94)

以下三种方法可以检查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"

答案 2 :(得分:10)

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

如果length为零则表示dict为空

答案 3 :(得分: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")

答案 4 :(得分:0)

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

        a= {}

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

虽然方法1st更严格,因为当a = None时,方法1将提供正确的结果,而方法2将提供不正确的结果。

答案 5 :(得分:0)

字典可以自动转换为布尔值,对于空字典,其值为False;对于非空字典,其值为True

if myDictionary: non_empty_clause()
else: empty_clause()

如果这看起来太惯用了,您还可以将len(myDictionary)测试为零,或将set(myDictionary.keys())测试为空集,或者仅测试与{}的相等性。

isEmpty函数不仅是不必要的,而且您的实现也存在多个问题,这些问题我都可以发现初步。

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

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

答案 6 :(得分:0)

test_dict = {}
if not test_dict.keys():
    print "Dict is Empty"

答案 7 :(得分:-1)

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

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

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

答案 8 :(得分:-4)

为什么不使用相等测试?

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

答案 9 :(得分:-6)

使用'任何'

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty