在 Python 中对列表进行布尔测试
Posted
技术标签:
【中文标题】在 Python 中对列表进行布尔测试【英文标题】:Boolean testing a list in Python 【发布时间】:2012-07-28 18:14:46 【问题描述】:我正在测试一个列表,看看它是否为空。通常我使用 len(list) == 0 并且我隐约记得不久前阅读过测试列表是否为空的正确方法是它是真还是假。
所以我尝试 list is False,结果返回 False。也许我想使用 == ? 不,这也返回了错误。 list 为 True,与 list == True 一样返回 false。
现在我很困惑,所以我快速搜索了一下,结果是:Best way to check if a list is empty
最佳答案是:
if not a:
print "List is empty"
所以我搜索了更多内容,最后在 python 手册中找到了 4.1 的说明:
可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。以下值被认为是错误的:
任何空序列,例如,''、()、[]。
现在我很困惑。如果我测试一个列表,就像不是列表一样,它工作正常。但是如果一个空列表是假的,那我为什么不能只做如果列表是假的或者如果列表==假呢?
谢谢
【问题讨论】:
【参考方案1】:空列表不是 False,但是当您将其转换为布尔值时,它会转换为 False。对于字典、元组、字符串等也是如此:
>>> [] == False
False
>>> bool([]) == False
True
>>> == False
False
>>> bool() == False
True
当您将某些内容置于if
子句的条件中时,它是用于测试if
的布尔值。这就是if someList
与if bool(someList)
相同的原因。同样,not foo
是布尔值 not,所以 not []
等于 True。
【讨论】:
具体调用nonzero方法【参考方案2】:正如其他人所说,在 python bool([]) == False
中。 python 程序员经常利用的一件事是运算符and
和or
不会(必然)返回True/False。考虑以下几点:
3 and 4 #returns 4
0 and 8 #returns 0 -- This is short-circuit evaluation
0 or 8 #returns 8
True or 0 #returns True -- This is short-circuit evaluation
[] or False #returns False
False or [] #returns []
if
语句中发生的情况是条件按上述方式进行评估,然后 python 隐式调用 bool
结果 -- 所以你可以把它想象成:
if condition:
与以下内容相同:
if bool(condition):
就 python 而言。 not
运算符也是如此:
not condition
和
是一样的not bool(condition)
【讨论】:
【参考方案3】:mylist is False
表示“名为mylist
的对象与False
完全相同?”
mylist == False
的意思是“名为mylist
的对象是否等于 False
?
not mylist
的意思是“名为mylist
的对象的行为是否错误?
这些都不等价:1 is not 1.0
但 1 == 1.0
和 [] != False
但 not [] is True
。
【讨论】:
【参考方案4】:将列表与False
进行比较,并测试列表的真假并不完全相同。空列表不等于False
,但在布尔上下文中表现为False
。
这是另一种说法,可能有助于理解这一点:
print (bool([]) == False) # will print True
print ([] == False) # will print False
【讨论】:
以上是关于在 Python 中对列表进行布尔测试的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中按日期列排序的组中对列进行排名