Pythonのブール値のリストがあります。AND(またはORまたはNOT)して結果を取得したい。次のコードは機能しますが、あまりPython的ではありません。
def apply_and(alist):
if len(alist) > 1:
return alist[0] and apply_and(alist[1:])
else:
return alist[0]
それをよりpythonicに感謝する方法に関する提案。
Pythonのブール値のリストがあります。AND(またはORまたはNOT)して結果を取得したい。次のコードは機能しますが、あまりPython的ではありません。
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
私たちは、すべての日に行くことができますが、はい、ニシキヘビの方法は、使用することですallし、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]
もちろん、これらの結果をどのように使用するかには、ド・モルガンの定理のいくつかの興味深いアプリケーションが必要になる場合があります。
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、ブール値以外のリストの場合、この回答が質問のコードと実際に同等になる唯一の回答になります。
このような操作のイディオムは、モジュールから取得した、または明示的にコーディングした適切な二項演算子を使用してreduce関数(Python 2.Xではグローバルfunctools、Python 3.Xではモジュール)を使用することoperatorです。あなたの場合、それはoperator.and_
reduce(operator.and_, [True, True, False])
他の回答が示すように、このタスクを実行する方法は複数あります。標準ライブラリの関数を使用する別のソリューションは次のとおりです。
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)