如何将逻辑运算符应用于Python列表中的所有元素

我有一个Python中的布尔值列表。 我想AND(或OR或NOT)他们并得到结果。 下面的代码工作,但不是pythonic。

def apply_and(alist): if len(alist) > 1: return alist[0] and apply_and(alist[1:]) else: return alist[0] 

任何build议如何使其更pythonic赞赏。

逻辑and a_list所有元素:

 all(a_list) 

逻辑or跨越a_list所有元素:

 any(a_list) 

如果你觉得有创意,你也可以这样做:

 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) 

请记住,这些不是短路评估,而内置的是;-)

另一个有趣的方式

 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 

还有一个:

 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 

我们可以一整天都去,但是,pythonic的方式是使用allany 🙂

顺便说一下,Python没有尾recursion消除,所以不要试图直接翻译LISP代码;-)

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 

注意也很简单:

 >>> [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] 

当然,如何使用这些结果可能需要德摩根定理的一些有趣的应用。

减less可以做到这一点:

 reduce(lambda a,b: a and b, alist, True) 

正如Fortran所说,所有这一切都是最简洁的方法。 但是,减less答案更一般的问题“如何将逻辑运算符应用于Python列表中的所有元素?

这种操作的用法是使用reduce函数(Python 2.X中的全局variables,Python 3.X中的模块functools中的variables)以及从operator模块获取的合适的二元运算operator或者明确编码。 在你的情况下,它是operator.and_

 reduce(operator.and_, [True, True, False]) 

这是另一个解决scheme:

 def my_and(a_list): return not (False in a_list) def my_or(a_list): return True in a_list 

如果所有元素均为True,则所有元素都将返回True,因此在列表中不会出现False。 ORing类似,但是如果列表中至less有一个True值,则返回True。

正如其他答案所显示的,有多种方法可以完成这个任务。 这是另一个使用标准库函数的解决scheme:

 from functools import partial apply_and = all apply_or = any apply_not = partial(map, lambda x: not x) if __name__ == "__main__": ls = [True, True, False, True, False, True] print "Original: ", ls print "and: ", apply_and(ls) print "or: ", apply_or(ls) print "not: ", apply_not(ls)