1. ホーム
  2. パイソン

[解決済み】Pythonのany関数とall関数はどのように機能するのですか?

2022-04-05 01:13:36

質問

を理解しようとしているのです。 any()all() Pythonの組み込み関数が動作します。

私は、タプルを比較して、いずれかの値が異なっていれば True を返し、すべて同じであれば False . この場合、それらはどのように動作して [False, False, False] を返すのでしょうか?

ddefaultdict(list) .

print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]

私の知る限り、これは次のように出力されるはずです。

# [False, True, False]

(1,1)は同じ、(5,6)は異なる、(0,0)は同じなので。

なぜ、すべてのタプルでFalseと評価されるのですか?

どのように解決するのですか?

大まかに考えて anyall を一連の論理的な orand 演算子を使用します。

任意

any を返します。 True とき のうち少なくとも1つの要素は はTruthyである。について読む 真偽値のテスト。

すべて

all を返します。 True のときだけです。 すべての要素 はTruthyである。

真理値表

+-----------------------------------------+---------+---------+
|                                         |   any   |   all   |
+-----------------------------------------+---------+---------+
| All Truthy values                       |  True   |  True   |
+-----------------------------------------+---------+---------+
| All Falsy values                        |  False  |  False  |
+-----------------------------------------+---------+---------+
| One Truthy value (all others are Falsy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| One Falsy value (all others are Truthy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| Empty Iterable                          |  False  |  True   |
+-----------------------------------------+---------+---------+

注1: 空のイテラブルのケースは、公式ドキュメントで以下のように説明されています。

any

戻る True イテラブルのいずれかの要素が真である場合。 イテラブルが空の場合は False

どの要素も真ではないので、次のようになります。 False この場合

all

戻る True イテラブルのすべての要素が真である場合 ( またはイテラブルが空の場合 ).

どの要素も false ではないので、次のように返されます。 True この場合


注2:

について、もう一つ重要なことがあります。 anyall というのは、結果を知った瞬間に実行がショートカットされるからです。利点は、イテラブル全体を消費する必要がないことです。例えば

>>> multiples_of_6 = (not (i % 6) for i in range(1, 10))
>>> any(multiples_of_6)
True
>>> list(multiples_of_6)
[False, False, False]

ここです。 (not (i % 6) for i in range(1, 10)) を返すジェネレータ式です。 True が6の倍数であるとき。 any を繰り返し実行します。 multiples_of_6 と出会い 6 を返すと、Truthyの値を見つけるので、すぐに True で、残りの multiples_of_6 は反復されない。これを印刷するとこうなります list(multiples_of_6) の結果である。 7 , 89 .

この優れたものを非常に巧妙に使っているのが この答え .


この基本的な理解で、あなたのコードを見てみると

any(x) and not all(x)

これは、少なくとも1つの値がTruthyであることを確認しますが、すべてではありません。そのため [False, False, False] . もし、本当に両方の数字が同じでないことを確認したいのであれば。

print [x[0] != x[1] for x in zip(*d['Drd2'])]