[英]How to apply a logical operator to all elements in a python list
我在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的建議表示贊賞。
邏輯上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方法是使用all
和any
:-)
順便說一句,Python沒有尾部遞歸消除,所以不要嘗試直接翻譯LISP代碼;-)
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定理的一些有趣應用。
減少可以做到這一點:
reduce(lambda a,b: a and b, alist, True)
正如fortran所提到的,一切都是最簡潔的方法。 但是減少回答一個更籠統的問題:“如何將邏輯運算符應用於python列表中的所有元素?”
此類操作的習慣用法是將reduce
函數(在Python 2.X中為global,在Python 3.X中為模塊functools
)與適當的二進制運算符一起使用,該二進制運算符取自operator
模塊或顯式編碼。 在您的情況下,它是operator.and_
reduce(operator.and_, [True, True, False])
這是另一個解決方案:
def my_and(a_list):
return not (False in a_list)
def my_or(a_list):
return True in a_list
如果所有元素均為True,則所有元素的AND運算將返回True,因此列表中沒有False。 ORing相似,但是如果列表中至少存在一個True值,則應該返回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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.