我在python中有一个布尔值列表。我想对它们进行AND(或OR或NOT)操作并获得结果。下面的代码可以工作,但不是非常Pythonic。
def apply_and(alist):
if len(alist) > 1:
return alist[0] and apply_and(alist[1:])
else:
return alist[0]
任何有关如何使其更pythonic的建议表示赞赏。
Answers:
逻辑and上的所有元素a_list:
all(a_list)
逻辑or上的所有元素a_list:
any(a_list)
如果您有创造力,也可以执行以下操作:
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)
请记住,这些不是在短路中评估的,而内置的是;-)
另一种有趣的方式:
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
还有一个:
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
并且我们可以整天去,但是是的,pythonic方法是使用alland any:-)
顺便说一句,Python还没有消除尾递归,所以不要尝试直接翻译LISP代码;-)
reduce()是functools因为Python 3.0
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
注意也很容易:
>>> [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]
当然,如何使用这些结果可能需要DeMorgan定理的一些有趣应用。
all(not x for x in some_list)但这与not any(some_list)(相当自然的表达式,是吗?)相同)。
减少可以做到这一点:
reduce(lambda a,b: a and b, alist, True)
如fortran所述,一切都是最简洁的方法。但是减少回答一个更笼统的问题:“如何将逻辑运算符应用于python列表中的所有元素?”
reduce是functools.reduce 在Python 3
, True,则对于非布尔值列表,此答案将是实际上与问题代码等效的唯一答案。
如其他答案所示,有多种方法可以完成此任务。这是另一个使用标准库中函数的解决方案:
from functools import partial
apply_and = all
apply_or = any
apply_not = partial(map, lambda x: not x)
if __name__ == "__main__":
ls = [True, True, False, True, False, True]
print "Original: ", ls
print "and: ", apply_and(ls)
print "or: ", apply_or(ls)
print "not: ", apply_not(ls)