有没有办法比较列表元素并返回结果值? 下面是python片段,它接收两个值并返回值。
def logical_or_decision(a,b):
return a or b
value = logical_or_decision(1,0)
print value
我需要使它成为通用的&可扩展到2个以上的元素。如何为2个以上的元素做到这一点?
答案 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
当然,您可以使用AND
或reduce
(对于逻辑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)
该问题有两种可能的解释:
或: 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
在这种情况下,使用的函数是相同的,但您需要使用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
虽然大多数建议使用any
和all
,但这似乎并不是您真正想要的:
>>> lst1 = [0, False, [], -1, ""]
>>> lst2 = [4, True, "", 0]
>>> any(lst1)
True
>>> all(lst2)
False
相反,您可以使用reduce
内置(或在Python 3:functools.reduce
)中使用一致的lambda
函数,应用or
或and
到操作数,获取列表中的第一个"truthy" or "falsy"值:
>>> reduce(lambda a, b: a or b, lst1)
-1
>>> reduce(lambda a, b: a and b, lst2)
''
此外,operator.or_
和and_
无效,因为它们是按位|
和&
而不是逻辑or
和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