Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表[多个元素]上执行逻辑操作?_Python_List_Logical Operators_Any - Fatal编程技术网

Python 如何在列表[多个元素]上执行逻辑操作?

Python 如何在列表[多个元素]上执行逻辑操作?,python,list,logical-operators,any,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个以上的元素执行此操作?有一个内置函数可以执行此操作:any >>> any([0,0,1,0]) True >>> any([0,0,

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

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

value = logical_or_decision(1,0)
print value

我需要使其通用并可扩展到2个以上的元素。如何为2个以上的元素执行此操作?

有一个内置函数可以执行此操作:
any

>>> any([0,0,1,0])
True

>>> any([0,0,0])
False

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

def logical_or_decision(*args):
    return reduce(
        lambda a, b: a or b,
        args,
        False
    )

print logical_or_decision(1, 1, 1, 0) # False
当然,您可以使用
any
all
(用于逻辑
),但是
reduce
可以为您提供构建此类操作的一般方法(不用于

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

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

any([True, False, True])
# returns True
任何
都是好的,因为“短路”(比如“布尔快速求值”直到结束都不会迭代)

如果您想要类似的东西,但需要手动操作和快速操作,请参阅:


对这个问题有两种可能的解释:

1.iterable所有元素的OR&AND操作: 或:
任何

和:
全部

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操作,以两个ITerable形式给出: 在这种情况下,使用的函数是相同的,但您需要使用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返回一个迭代器而不是列表,这将给出一个非人类可读的答案。

来自您的:

假设我有一个[0,-1]的列表,它应该返回-1。如果[0,0,-1],则应返回-1

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

>>> lst1 = [0, False, [], -1, ""]
>>> lst2 = [4, True, "", 0]
>>> any(lst1)
True
>>> all(lst2)
False
相反,您可以将内置函数(或在Python 3中:
functools.reduce
)与相应的
lambda
函数一起使用,对操作数应用
,以获得列表中的第一个值:

>>> reduce(lambda a, b: a or b, lst1)
-1
>>> reduce(lambda a, b: a and b, lst2)
''
而且,and也不起作用,因为它们是按位的
|
&
而不是逻辑的

>>> 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
>>reduce(operator.or,lst1)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:|“int”和“list”的操作数类型不受支持
>>>lst=[1,2,4]
>>>减少(运算符or,lst)
7.

您可能希望将其与中可用的运算符一起使用,而不是使用
lambda
@AshwiniChaudhary请注意
运算符。或
,而不是
@tobias\u k Oops!我的错。还有“和”等价的
全部
。如果有3个元素像这样0,1,-1呢?假设我有一个[0,-1]的列表,它应该返回-1。如果[0,0,-1],则应返回-1@Jackie
-1
代表什么?您还使用了哪些其他输入?没有,只有三个输入。我的意思是代表三种可能的状态,成功、失败和未知。0, 1 , -1@Jackie问题根本不是这么说的。问一个包含所有信息的新问题;编辑这个会使5个答案无效。包括一些示例输入/输出-对于某些给定的输入,您希望函数返回的内容。
any()
不是惰性的,它只是短路。它的懒惰将取决于你作为论据传递给它的iterable。我的意思是,
any
在“生成器延迟求值”和“布尔快速求值”方面是“延迟的”—首先停止
True
元素—它直到最后才迭代。True,但正确的术语是短路。懒散是一种你可能会联想到的东西,例如生成器,它们可以暂停执行,并根据需要将结果返回给你,而不是一次返回所有结果。这里的
any()
不知道传递给它的项,它只是一个接一个地迭代。因此,它完全取决于传递给它的iterable。是否严格地返回
True
False
,或者(在
的情况下)列表的第一个truthy值,如
a或b或c或…
所示?
>>> 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