如何对Python列表中的所有元素应用逻辑运算符
我在Python中有一个布尔值的列表。我想对这些布尔值进行与(AND)、或(OR)或非(NOT)运算,并得到结果。下面的代码可以实现这个功能,但看起来不是很符合Python的风格。
def apply_and(alist):
if len(alist) > 1:
return alist[0] and apply_and(alist[1:])
else:
return alist[0]
如果有任何建议可以让它更符合Python的风格,我会很感激。
6 个回答
19
Reduce 可以做到这一点:
reduce(lambda a,b: a and b, alist, True)
正如 fortran 提到的,all 是最简洁的方法。但 reduce 则回答了一个更普遍的问题:“如何将一个逻辑运算符应用到 Python 列表中的所有元素?”
34
做与运算(AND)和或运算(OR)是很简单的:
>>> 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)也相对简单:
>>> [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]
当然,如何使用这些结果可能需要用到德摩根定理的一些有趣应用。
224
对列表 a_list
中所有元素进行逻辑 与
操作:
all(a_list)
对列表 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
我们可以一直聊下去,但是的,最符合 Python 风格的方法是使用 all
和 any
:-)
顺便提一下,Python 不支持尾递归优化,所以不要直接把 LISP 的代码翻译过来哦 ;-)