如何将逻辑运算符应用于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的方式是使用all和any 🙂 
顺便说一下,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)