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)