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

Rob*_*tie 72 python

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

def apply_and(alist):
 if len(alist) > 1:
     return alist[0] and apply_and(alist[1:])
 else:
     return alist[0]
Run Code Online (Sandbox Code Playgroud)

有关如何使其更加pythonic赞赏的任何建议.

for*_*ran 147

and跨越所有元素的逻辑a_list:

all(a_list)
Run Code Online (Sandbox Code Playgroud)

or跨越所有元素的逻辑a_list:

any(a_list)
Run Code Online (Sandbox Code Playgroud)

如果您觉得有创意,您还可以:

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)
Run Code Online (Sandbox Code Playgroud)

请记住,那些不是短路评估,而内置插件是;-)

又有趣的方式:

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
Run Code Online (Sandbox Code Playgroud)

又一个:

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
Run Code Online (Sandbox Code Playgroud)

我们可以整天继续,但是,是的,pythonic的方式是使用allany:-)

顺便说一下,Python没有尾递归消除,所以不要试图直接翻译LISP代码;-)

  • operator.and_是按位和运算符&,而不是逻辑和. (8认同)
  • 解释了很多冗余版本,但没有提供实际正确答案的语法. (6认同)
  • 不同意任何你想要的,它在常见问题:http://stackoverflow.com/privileges/vote-down (2认同)
  • 请注意,自Python 3.0以来,`reduce()`位于`functools`中。 (2认同)

Jas*_*ker 32

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
Run Code Online (Sandbox Code Playgroud)

注意也很容易:

>>> [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]
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你想要短变量not变量,只需使用生成器表达式:`all(而不是x表示some_list中的x)`(但这与`not any(some_list)`相同`(非常自然的表达式,是吗?) ). (4认同)

Fra*_*ger 14

减少可以做到这一点:

reduce(lambda a,b: a and b, alist, True)
Run Code Online (Sandbox Code Playgroud)

正如Fortran所提到的,所有这些都是最简洁的方式.但是,减少回答更一般的问题"如何将逻辑运算符应用于python列表中的所有元素?"

  • 减少不会消失,AFAIK.它被移动到functools模块中,从之前在全局命名空间中的位置 (4认同)

Eli*_*sky 8

这种操作的习惯用法是使用reduce函数(Python 2.X中的全局,functools在Python 3.X 中的模块中),使用适当的二元运算符从operator模块中取出或明确编码.在你的情况下,它是operator.and_

reduce(operator.and_, [True, True, False])
Run Code Online (Sandbox Code Playgroud)