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
。你给的链接对应any
method,这取决于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:检查“字典”是不是为空似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章