如何在列表[多个元素]上执行逻辑运算?

时间:2016-12-20 07:43:31

标签: python list logical-operators any

有没有办法比较列表元素并返回结果值? 下面是python片段,它接收两个值并返回值。

def logical_or_decision(a,b):
    return a or b

value = logical_or_decision(1,0)
print value

我需要使它成为通用的&可扩展到2个以上的元素。如何为2个以上的元素做到这一点?

6 个答案:

答案 0 :(得分:4)

有一个内置函数可以执行此操作:string compressedData = "Getting from some function"; string decompressedData = null; bool compressed = true; //your result try { decompressedData = Decompress(compressedData); } catch { compressed = false; }

any

答案 1 :(得分:2)

您可以使用any来执行此操作:

all

当然,您可以使用ANDreduce(对于逻辑OR),但AND可以为您提供构建此类操作的一般方法(不适用于{{ 1}}或SELECT * FROM table_name ORDER BY id IS NULL, id ASC )。

答案 2 :(得分:2)

最佳解决方案^^以上^^:

any([True, False, True])
# returns True

any很好,因为"短路" (比较"布尔快速评估"它不会迭代直到结束)。

如果你想要相似但手动和渴望 - 请参阅reduce

from operator import or_
from functools import reduce

reduce(or_, [True, False, True])
# returns True

答案 3 :(得分:0)

内置函数any()将是解决此问题的正确方法:

def logical_or_decision(*args):
    return any(args)

value = logical_or_decision(1, 0, 0, 1, 0, 0) 
print value

上述官方文档链接中的相关部分:

  

如果iterable的任何元素为true,则返回True。如果iterable为空,则返回False。相当于:

def any(iterable):
   for element in iterable:
       if element:
           return True
   return False

答案 4 :(得分:0)

该问题有两种可能的解释:

1。 OR&对可迭代的所有元素的AND操作:

或: any

AND: all

l1 = [True, False, False, True]
t1 = (True, True, True)
t2 = (False, False, False, False)

any(l1)  # True
all(l1)  # False
any(t1)  # True
all(t1)  # True
any(t2)  # False
all(t2)  # False

2。 OR&以两个迭代次数给出的多对的AND运算:

在这种情况下,使用的函数是相同的,但您需要使用map和zip函数来包装它们:

l = [True, True, False]
t = (True, False, False)

list(map(any, zip(l, t)))   # [True, True, False]
tuple(map(all, zip(l, t)))  # (True, False, False)

注意: 我使用了列表和元组来证明它可以使用不同的类似数组的结构来完成。第二个例子中的列表和元组包装器是Python3,因为map返回一个迭代器而不是一个列表,这将给出一个非人类可读的答案。

答案 5 :(得分:0)

来自comment

  

说我有一个[0,-1]的列表,它应该返回-1。 if [0,0,-1],它应返回-1

虽然大多数建议使用anyall,但这似乎并不是您真正想要的:

>>> lst1 = [0, False, [], -1, ""]
>>> lst2 = [4, True, "", 0]
>>> any(lst1)
True
>>> all(lst2)
False

相反,您可以使用reduce内置(或在Python 3:functools.reduce)中使用一致的lambda函数,应用orand到操作数,获取列表中的第一个"truthy" or "falsy"值:

>>> reduce(lambda a, b: a or b, lst1)
-1
>>> reduce(lambda a, b: a and b, lst2)
''

此外,operator.or_and_无效,因为它们是按位|&而不是逻辑orand

>>> reduce(operator.or_, lst1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for |: 'int' and 'list'
>>> lst = [1, 2, 4]
>>> reduce(operator.or_, lst)
7