如何将逻辑运算符应用于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)