複数の変数が単一の値と等しいかどうかをテストするにはどうすればよいでしょうか? 質問する

複数の変数が単一の値と等しいかどうかをテストするにはどうすればよいでしょうか? 質問する

複数の変数を整数と比較し、3 文字の文字列を出力する関数を作成しようとしています。これを Python に翻訳する方法があるかどうか疑問に思っています。次のようにします。

x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0:
    mylist.append("c")
if x or y or z == 1:
    mylist.append("d")
if x or y or z == 2:
    mylist.append("e")
if x or y or z == 3: 
    mylist.append("f")

次のリストが返されます:

["c", "d", "f"]

ベストアンサー1

ブール式の仕組みを誤解しています。ブール式は英語の文章のようには機能せず、ここではすべての名前について同じ比較について話していると思われます。探しているのは次のものです。

if x == 1 or y == 1 or z == 1:

xそれ以外の場合は、y独自に評価されます ( Falseif 0Trueotherwise )。

これを短縮するには、封じ込めテストを使用します。タプル:

if 1 in (x, y, z):

あるいはもっと良いのは:

if 1 in {x, y, z}:

使用して1つのset一定コストのメンバーシップ テストを活用する (つまり、in左側のオペランドが何であっても、一定の時間がかかります)。

説明

を使用するとor、Python は演算子の各辺を別々の式として認識します。式はx or y == 1最初に のブール値テストとして扱われx、それが False の場合、式がy == 1テストされます。

これは、に起因するものです演算子の優先順位演算子orの優先順位はテストよりも低いため==、テストが最初に評価されます。

ただし、たとえそうでなく式がx or y or z == 1実際には として解釈されたとしても(x or y or z) == 1、期待どおりには動作しません。

x or y or zは、最初の引数が「真」であるものとして評価されます。たとえば、 ではないFalse、数値0、または空です(ブール式Python がブール値のコンテキストで false と見なすものの詳細については、こちらを参照してください。

したがって、値 の場合x = 2; y = 1; z = 0x or y or zは に解決されます2。これは、引数の最初の true のような値だからです。すると、2 == 1は になりますFalseが、 はy == 1になりますTrue

逆の場合も同様です。つまり、複数の値を 1 つの変数に対してテストすると、x == 1 or 2 or 3同じ理由で失敗します。x == 1 or x == 2 or x == 3または を使用しますx in {1, 2, 3}

おすすめ記事