我有一个python中的布尔列表.我想和他们(或或或不)他们得到结果.以下代码有效但不是非常pythonic.
def apply_and(alist):
if len(alist) > 1:
return alist[0] and apply_and(alist[1:])
else:
return alist[0]
Run Code Online (Sandbox Code Playgroud)
有关如何使其更加pythonic赞赏的任何建议.
for*_*ran 147
and跨越所有元素的逻辑a_list:
all(a_list)
Run Code Online (Sandbox Code Playgroud)
or跨越所有元素的逻辑a_list:
any(a_list)
Run Code Online (Sandbox Code Playgroud)
如果您觉得有创意,您还可以:
import operator
def my_all(a_list):
return reduce(operator.and_, a_list, True)
def my_any(a_list):
return reduce(operator.or_, a_list, False)
Run Code Online (Sandbox Code Playgroud)
请记住,那些不是短路评估,而内置插件是;-)
又有趣的方式:
def my_all_v2(a_list):
return len(filter(None,a_list)) == len(a_list)
def my_any_v2(a_list):
return len(filter(None,a_list)) > 0
Run Code Online (Sandbox Code Playgroud)
又一个:
def my_all_v3(a_list):
for i in a_list:
if not i:
return False
return True
def my_any_v3(a_list):
for i in a_list:
if i:
return True
return False
Run Code Online (Sandbox Code Playgroud)
我们可以整天继续,但是,是的,pythonic的方式是使用all和any:-)
顺便说一下,Python没有尾递归消除,所以不要试图直接翻译LISP代码;-)
Jas*_*ker 32
ANDing和ORing很简单:
>>> some_list = [True] * 100
# OR
>>> any(some_list)
True
#AND
>>> all(some_list)
True
>>> some_list[0] = False
>>> any(some_list)
True
>>> all(some_list)
False
Run Code Online (Sandbox Code Playgroud)
注意也很容易:
>>> [not x for x in some_list]
[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
Run Code Online (Sandbox Code Playgroud)
当然,如何使用这些结果可能需要DeMorgan定理的一些有趣的应用.
Fra*_*ger 14
减少可以做到这一点:
reduce(lambda a,b: a and b, alist, True)
Run Code Online (Sandbox Code Playgroud)
正如Fortran所提到的,所有这些都是最简洁的方式.但是,减少回答更一般的问题"如何将逻辑运算符应用于python列表中的所有元素?"
这种操作的习惯用法是使用reduce函数(Python 2.X中的全局,functools在Python 3.X 中的模块中),使用适当的二元运算符从operator模块中取出或明确编码.在你的情况下,它是operator.and_
reduce(operator.and_, [True, True, False])
Run Code Online (Sandbox Code Playgroud)