1. ホーム
  2. python

[解決済み] 複数の変数が1つの値に対して等しいかどうかをテストするには?

2022-03-21 23:25:13

質問

複数の変数を整数で比較し、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"]

このようなことは可能でしょうか?

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

あなたはブール式の仕組みを誤解しています。ブール式は英文のようには機能せず、ここではすべての名前について同じ比較を話しているのだと推測してください。あなたは探しているのです。

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

xy はそれ自体で評価されます ( False もし 0 , True それ以外の場合)。

に対する封じ込めテストを使って短くすることができます。 タプル :

if 1 in (x, y, z):

とか、もっといいのがあります。

if 1 in {x, y, z}:

を使って a 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 は、最初の引数が'truthy'であれば、評価されます。 False であったり、数値の0であったり、空であったりします。 ブール式 Pythonがbooleanコンテキストで何をfalseとみなすかについての詳細はこちら)。

つまり、値については x = 2; y = 1; z = 0 , x or y or z は、次のように解決します。 2 なぜなら、それが引数の中で最初の真に近い値だからです。次に 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} .