我有一個Python中布爾值列表。我想AND(或OR或NOT)他們並得到結果。下面的代碼工作,但不是pythonic。如何將邏輯運算符應用於python列表中的所有元素
def apply_and(alist):
if len(alist) > 1:
return alist[0] and apply_and(alist[1:])
else:
return alist[0]
如何使它更Python知道的任何建議。
我有一個Python中布爾值列表。我想AND(或OR或NOT)他們並得到結果。下面的代碼工作,但不是pythonic。如何將邏輯運算符應用於python列表中的所有元素
def apply_and(alist):
if len(alist) > 1:
return alist[0] and apply_and(alist[1:])
else:
return alist[0]
如何使它更Python知道的任何建議。
邏輯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
,我們可以去上一整天,但肯定的,Python的方式是使用all
和any
:-)
由WA Y,Python有沒有尾遞歸消除,所以不要嘗試翻譯LISP代碼直接;-)
Reduce可以這樣做:
reduce(lambda a,b: a and b, alist, True)
正如FORTRAN所提到的,都是最簡潔的方式做它。但是減少答案是一個更一般的問題「如何將邏輯運算符應用於Python列表中的所有元素?」
減少不會消失,AFAIK。它被移到了functools模塊中,從之前在全局命名空間中的位置開始 – 2009-11-24 14:52:11
@eliben:爲什麼要談論未來時的Python 3? *減少仍然存在*。 'reduce'是Python 3中的'functools.reduce' * * – u0b34a0f6ae 2009-11-24 16:19:13
如果刪除',True',那麼對於非布爾列表,這個答案將是唯一一個實際上等價於問題代碼的答案。 – 2016-08-20 14:24:43
與和或門很簡單:
>>> 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]
當然,你將如何使用這些結果可能需要德摩根定理的一些有趣的應用。
如果你想要短循環的非變體,只需使用生成器表達式:'all(不是x for some_list中的x)「(但是這與'not any(some_list)'相同(很自然的表達,呵呵? ))。 – u0b34a0f6ae 2009-11-24 16:22:26
正如其他答案所顯示的,有多種方法可以完成此任務。下面是一個使用功能標準庫的另一種解決方案:
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)
這種行動的成語是用適當的二進制使用(在Python 3.X全球在Python 2.X,在模塊functools
)的reduce
功能操作員從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如果所有元素都是真的,在列表中,因此不存在任何虛假。 ORing類似,但如果列表中存在至少一個True值,它應該返回True。
operator.and_是按位和運營商,而不是邏輯和。 – 2009-11-24 15:17:56
luckly真假(如運算所需)分別鑄造爲1和0,所以按位運算符的工作作爲邏輯^ _^ – fortran 2009-11-24 22:27:47
值得注意... 2.5+但很容易的backport。 – 2010-05-01 22:03:12