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

时间:2009-11-24 14:44:40

标签: python

我在python中有一个布尔列表。我想和他们(或或或不)他们得到结果。以下代码有效但不是非常pythonic。

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

有关如何使其更加抒情的任何建议。

6 个答案:

答案 0 :(得分:139)

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没有尾递归消除,所以不要试图直接翻译LISP代码; - )

答案 1 :(得分:31)

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]

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

答案 2 :(得分:13)

Reduce可以做到这一点:

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

正如Fortran所说,所有这些都是最简洁的方式。但是,reduce更常见的问题是“如何将逻辑运算符应用于python列表中的所有元素?”

答案 3 :(得分:7)

此类操作的习惯用法是使用reduce函数(Python 2.X中的全局,在Python 3.X中的模块functools中),并使用适当的二元运算符取自{{ 1}}模块或明确编码。在您的情况下,它是operator

operator.and_

答案 4 :(得分:3)

这是另一种解决方案:

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

def my_or(a_list):
    return True in a_list

如果所有元素都为True,则ANDing所有元素都将返回True,因此列表中没有False。 ORing类似,但如果列表中至少存在一个True值,则应返回True。

答案 5 :(得分:0)

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

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)