Python:检查“字典”是否为空似乎不起作用


396

我正在尝试检查字典是否为空,但是行为不正常。它只是跳过它并显示“ 联机”,除了显示消息外没有任何其他内容。有什么主意吗?

 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

4
isEmpty实际上返回True如果从字典中产生的第一个关键是truey并返回False,否则。如果字典为空,则返回None不为的字典== False
Hyperboreus 2014年

您的if语句向后。
疯狂物理学家

要小心使用类似假的键stackoverflow.com/a/17347421/1379762
Wajih,2016年

Answers:


736

空字典在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是什么意思?
查理·帕克

2
我觉得“非
辞典

同意,我想使用布尔值,not <dict>也不太清楚
cryanbhu

130

您可以通过以下三种方法检查dict是否为空。我更喜欢只使用第一种方法。其他两种方式过于罗y。

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
感叹……每个人都喜欢“ Python风格”,并且输入最少的字符。首先,另一个标准是可读性。其次,以上答案中的第一个测试不仅在dict存在且为空的情况下为true,而且在test_dict为None的情况下也是如此。因此,仅在知道dict对象存在(或区别无关紧要)时才使用此测试。第二种方式也有这种行为。如果test_dict为None,则只有第三种方式吠叫。
安德烈亚斯·麦耶

1
@AndreasMaier也是我的感觉。另外,python是动态输入的。在函数内部通常检查“如果x是非空字典,则执行此操作;如果x是非空numpy数组,则执行该操作”。然后,if x当x是numpy数组时,第一个代码将失败
jf328

1
@Wajih,您的链接在这里仍然不相关...看看为什么
Ulysse BN

1
尽管出于技术原因我对此表示赞同,但仍不反对。@AndreasMaier
Stunner

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

如果length为零,则表示dict为空


3
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
DimaSan '16

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

尽管方法1st在a = None时更为严格,但方法1将提供正确的结果,而方法2将提供不正确的结果。


1

字典可以自动转换为布尔值,布尔值为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'}


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

这看起来像语法错误,并且没有显示如何在问题的上下文中应用检查。
罗兰·韦伯

-7

使用“任何”

dict = {}

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

4
any检查是否包含字典任何truthy键,例如any({0: 'something'})返回False即使字典不为空
Railslide

是的,从真假和空白这两个案例中解脱出来的话,其他明智的布尔对真假案例将是正确的。如果您考虑一般的编码目的。
乔图·萨尔达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.