複数の変数を整数と比較し、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
独自に評価されます ( False
if 0
、True
otherwise )。
これを短縮するには、封じ込めテストを使用します。タプル:
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 = 0
、x 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}
。