Python 如何在列表[多个元素]上执行逻辑操作?
有没有办法比较列表元素并返回结果值? 下面是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,
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