簡體   English   中英

如何將邏輯運算符應用於python列表中的所有元素

[英]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)

邏輯上ora_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方法是使用allany :-)

順便說一句,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM