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

118 投票
6 回答
129251 浏览
提问于 2025-04-15 16:20

我在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 风格的方法是使用 allany :-)

顺便提一下,Python 不支持尾递归优化,所以不要直接把 LISP 的代码翻译过来哦 ;-)

撰写回答