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

Posted

技术标签:

【中文标题】Python:检查“字典”是不是为空似乎不起作用【英文标题】:Python: Checking if a 'Dictionary' is empty doesn't seem to workPython:检查“字典”是否为空似乎不起作用 【发布时间】:2014-06-04 08:09:07 【问题描述】:

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

【问题讨论】:

要检查self.users 是否为非空,只需执行if self.users 你的isEmpty实际上返回True如果从字典产生的第一个键是truey,否则返回False。如果字典为空,则返回None,它不是== False 你的 if 语句是倒退的。 小心假键***.com/a/17347421/1379762 Python:Efficient way to check if dictionary is empty or not的可能重复 【参考方案1】:

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

【讨论】:

@Wajih 您的链接无关紧要:bool(False: False)still 的计算结果为 True。你给的链接对应anymethod,这取决于keys。 @Wajih 这是什么意思? 我觉得'not dict'不明确 同意,我觉得使用布尔值和not <dict> 也不是很清楚 "你的 isEmpty 函数是不必要的" 它使代码更容易理解。【参考方案2】:

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

【讨论】:

叹息......每个人都喜欢成为“pythonic”并且输入最少的字符。首先,另一个标准是可读性。其次,上面答案中的第一个测试不仅在dict存在且为空的情况下为真,而且在test_dict为None的情况下也是如此。因此,仅当您知道 dict 对象存在(或差异无关紧要)时才使用此测试。第二种方式也有这种行为。如果 test_dict 为 None,则只有第三种方式吠叫。 @AndreasMaier 正是我的感觉。此外,python 是动态类型的。在函数内部,通常会检查“如果 x 是非空字典,则执行此操作;如果 x 是非空 numpy 数组,则执行此操作”。那么当 x 是 numpy 数组时,第一个代码将在 if x 上失败 @Wajih 你的链接在这里仍然无关紧要......见why 由于我的担忧,尽管技术上是正确的,但不赞成这一点。 @AndreasMaier【参考方案3】:

使用“任何”

dict = 

if any(dict) :

     # true
     # dictionary is not empty 

else :

     # false 
     # dictionary is empty

【讨论】:

any 检查字典是否包含任何真实键,例如any(0: 'something') 返回 False 即使 dict 不为空 是的,为了从两个案例中保存,真实的和空白的,其他明智的布尔会为真实的案例给出 true。如果您考虑一般编码目的。【参考方案4】:
dict = 
print(len(dict.keys()))

如果长度为零表示dict为空

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 len(dict.keys()) 等价于len(dict) @pdpAxis 在它给出的值中,虽然我敢打赌dict.__len__ 的实现可能会快一点。 :)【参考方案5】:

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

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

我喜欢get的一点是它不会触发异常,因此可以轻松遍历大型结构。

【讨论】:

【参考方案6】:

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

        a= 

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

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

【讨论】:

【参考方案7】:

可以自动将字典转换为布尔值,对于空字典计算为 False,对于非空字典计算为 True

if myDictionary: non_empty_clause()
else: empty_clause()

如果这看起来太惯用了,您还可以测试len(myDictionary) 是否为零,或测试set(myDictionary.keys()) 是否为空集,或者只需使用 测试是否相等。

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

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

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

【讨论】:

【参考方案8】:
test_dict = 
if not test_dict.keys():
    print "Dict is Empty"

【讨论】:

【参考方案9】:

一种方式:

 len(given_dic_obj) 

如果没有元素则返回 0 否则返回字典的大小。

第二种方式:

bool(given_dic_object)

如果字典为空则返回 True,否则返回 false

【讨论】:

以上是关于Python:检查“字典”是不是为空似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

按位置过滤推文

如何检查 Recyclerview 是不是为空

如何检查Lua中的值是不是为空?

更改导入模块的变量似乎不起作用。 [Python]

GSP:检查模型(变量)是不是为空不工作

python将字典追加到列表