19

私は次のpythonコードを参照しています

all(a==2 for a in my_list)

my_list のすべての要素が 2 の場合、上記のコードは True を返すと予想しますが、my_list を空にして次のように実行すると、

my_list = []
all(a==2 for a in my_list) 

True も返します。私はこの行動に混乱しています。my_list に値 2 の要素がないため、False を返すことは想定されていませんか?

4

5 に答える 5

7

簡単に確認できるように、空のリストに適用される「すべて」は「空虚に真」です。

>>> all([])
True

同様に、「0 = 1 の場合、月は正方形である」は true です。より一般的には、「すべての P は Q である」 - P がない場合、「すべての x について、x が P の場合、x は Q である」と形式的に捉えることができるため、ステートメントは真と見なされます。最終的に、条件付き論理演算子 (if-then) が前件 (最初の句) が False の場合は常に True と評価されるため、これらは true になります。「if False then True」は True と評価されます。「if A then B」は「(not A) or B」と同等であることを思い出してください。

2022年1 月追加allおよび Python リストの場合、 のブール値all(my_list)は の値です

"for all items `x` in `my_list`, the value of `x` is truthy". 

が空の場合my_list、その値は True です。繰り返しますが、「すべてのために」でありall、存在を主張するものではありません。

Python 疑似コードでは、allおおよそ次のように機能します。

val = True
for x in my_list:
    if not x:
        val = False
        break
# assert val == all(my_list)
于 2013-10-26T04:37:05.990 に答える
4

の再帰的な定義を考えてみましょうall:

def all(L):
    if L:
        return L[0] and all(L[1:])
    else:
        ???

のすべての要素Lが true の場合、最初の項目Lが true であり、それall(L[1:])が true であることが true でなければなりません。これは、複数の項目があるリストの場合は簡単にわかりますが、項目が1 つのリストの場合はどうでしょう。明らかに、唯一の項目が true の場合、すべての項目が true ですが、その場合、再帰的な定式化はどのように機能するのでしょうか? true であると定義all([])すると、アルゴリズムが機能します。

別の見方をすると、真でないLリストについてall(L)は、真でない要素を少なくとも 1 つ特定できるはずです。ただし、 when が空の場合はそのようなことはありません。aaLLall([])

に対しても同じ引数が機能しanyます。が true の場合any(L)、少なくとも 1 つの要素Lが true であることを識別できるはずです。しかし、空のリストはできないので、それは偽Lであると言えます。any([])の再帰的な実装はanyこれをバックアップします:

def any(L):
    if L:
        return L[0] or any(L[1:])
    else:
        return False

が true の場合L[0]、再帰呼び出しを行うことなく true を返すことができるため、L[0]is が false であると仮定します。基本ケースに到達する唯一の方法は、Ltrue の要素がない場合です。したがって、到達した場合は戻る必要がありFalseます。

于 2013-10-26T02:01:06.507 に答える