Python中列表的布尔值
将列表转换为布尔值的最佳方法是什么?我正在寻找类似于:Python中列表的布尔值,python,list,boolean,Python,List,Boolean,将列表转换为布尔值的最佳方法是什么?我正在寻找类似于: return eval_bool(my_list) 我有一个自定义容器,在其中我实现了\uuu nonzero\uuu方法,该方法的工作原理如下: if self.my_list: return True return False 但它够像蟒蛇吗?:)无论如何,我很好奇Python如何解释if语句中列表的值,因为这段代码的工作方式不同: return my_list == True J.只需使用: bool(my_list)
return eval_bool(my_list)
我有一个自定义容器,在其中我实现了\uuu nonzero\uuu
方法,该方法的工作原理如下:
if self.my_list:
return True
return False
但它够像蟒蛇吗?:)无论如何,我很好奇Python如何解释if
语句中列表的值,因为这段代码的工作方式不同:
return my_list == True
J.只需使用:
bool(my_list)
它将其计算为Python“truthiness”,并返回一个实布尔值。如果len(my_list)==0
则返回为false
,否则返回为true
。写下以下内容完全是一种勾股:
return len(my_list)
虽然返回的是整数,但对于非零长度,其计算结果为true
,否则为false。您可以使用三元“if”运算符。谷歌表示它从2.5开始就支持
foo = True if your_list else False
99.9%的情况下,性能并不重要,所以只需使用
bool(我的列表)
as
在性能确实重要的情况下,bool
的性质意味着它实际上相当慢,至少在CPython引用解释器上是这样。它必须经过广义函数调用路径、广义构造函数路径、0-1参数的广义参数解析(以及在中,检查关键字参数),所有这些最终都只是作为单例上的引用计数递增并返回它
您可以通过ipython
microbenchmarks(在我的Windows x64 3.6.3版本上)查看此功能的成本:
这可能并不明显,但即使在我相对较弱的笔记本电脑上,仅用117-118纳秒来确定真实性也有点过分。幸运的是,还有几个其他的选择。一种是滥用语法,通过专用路径进行真实性评估(从这里开始,我只测试空的列表
,两种方式的计时基本相同):
这是一个巨大的进步;大约需要五分之一的时间。在Python3上,使用True if l else False
也可以以同样的速度工作,但比Python2上的not not
慢得多,其中True
和False
不是受保护的文本,只是每次必须动态加载的内置名称
不过,这并不完美;有时您需要一个可调用函数,例如通过回调函数(例如使用map
)将大量值转换为bool
。幸运的是,你已经覆盖了;虽然它仍然是一个具有所有开销的可调用函数,但它不是一个构造函数,它只需要一个参数(不是0-1),并且它不允许关键字参数,所有这些都在CPython引用解释器上花费了惊人的成本。因此,当您无法将隐式真实性测试或基于语法的转换与not
一起使用时,您仍然需要速度,操作符。truth
您介绍过:
In [4]: from operator import truth
In [5]: %%timeit -r5 l = []
...: truth(l)
...:
52.1 ns ± 1.1 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)
两倍于not
,但如果您将其与重复调用它的内置程序一起使用(如map
),则能够将所有工作推送到C层,完全避免字节码执行,仍然可以使其获胜,而且成本仍然低于bool()
本身的一半
不过重申我之前的观点:99.9%的时间里,性能并不重要,所以只需使用
bool(我的列表)
as。我之所以提到这一点,是因为我曾经遇到过这样一个场景,即布尔转换实际上是我代码中最热门的点(通过评测进行验证),并使用隐式真实性测试(甚至不转换,只返回列表
,调用者执行if myfunc():
)减少了30%的运行时间,返回列表的not not
仍然节省了近20%。虽然可以使用bool
,但如果调用我的列表:
,让Python决定我的列表
的计算值是否应该为True
或False
@SimeonVisser:为什么if my\u list:return True\n return False
比return bool(my\u list)
更像pythonic吗?编写if bool(my\u list)并不常见:
当您也可以编写if my\u list:
时。在大多数情况下,您只需要检查列表是否为空,并不需要布尔值。Python可以看到您正在计算if语句,它会调用bool()
本身。如果确实需要布尔值(例如,作为输出),则bool(my\u list)
当然可以。@SimeonVisser这里的目标根本不是有条件逻辑,而是返回一个布尔值。但是,这将返回整数值,我们需要一个布尔值。它可以工作,但它违反了pep 8:对于序列(字符串、列表、元组),使用空序列为false的事实。是:如果不是seq:if seq:No:if len(seq)如果不是len(seq)注意:在Python2中,至少对于CPython引用解释器来说,这是令人惊讶的慢,因为True
和False
都是必须从内置名称空间加载的全局内置项(这涉及到一对字典查找,一个用于全局,当找不到它们时,第二个用于内置项),而不是文字常量。在Python 3中,它们是文字常量,只需要一条便宜的LOAD\u CONST
指令即可加载(这归结为一个C级数组查找),因此这是转换为bool
的两种最快方法之一(另一种是而不是您的\u列表
)。
In [3]: %%timeit -r5 l = []
...: not not l
...:
25 ns ± 0.289 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)
In [4]: from operator import truth
In [5]: %%timeit -r5 l = []
...: truth(l)
...:
52.1 ns ± 1.1 ns per loop (mean ± std. dev. of 5 runs, 10000000 loops each)