1

次のようなpythonサンプルコードがあります。

入力: (x,y)

         if x==0 and y==0:    
            print x+y+1     
         elif x==0 and y==y:    
            print x+y*y+2    
         elif x==x and y==0:    
            print x*x+y+3    
         else:    
            print x*x+y*y+4    

入力が (x,y) = (0,0) の場合、他の条件をチェックせずに 1 を出力するため、条件に直接切り替えるにはどうすればよいですか?

私は辞書を使ってこれを試しました。

入力: (x,y)

         def Case1():
               print x+y+1     
         def Case2():      
               print x+y*y+2     
         def Case3():
               print x*x+y+3    
         def Case4():      
               print x*x+y*y+4     

         dict = {(0,0): Case1,
                 (0,y): Case2,
                 (x,0): Case3,
                 (x,y): Case4,
         }  

         dict[(x,y)]()     

入力 (x,y) = (0,0) でこれを試したところ、出力は 1 ではなく 4 になりました。私のコードは Case4 のみをチェックしているようです。辞書で何が間違っていますか?

ありがとう!

4

3 に答える 3

2

Python の仕組みをよく理解していないようです。辞書は、Haskell や Erlang のようなパターン マッチング ブロックではありません。内部に具体的な値を持つデータ構造です。print dict定義の後に書き込んで、その内容を確認することができます。

を作成すると、とdictの現在の具体的な値がキーの作成に使用されます。その時点でたまたま 0 の場合、キーは に置き換えられます (そのため、あなたの場合は が呼び出されます)。xyxy(0,0)(x,y)Case4

于 2013-10-09T11:33:08.960 に答える
1

xBogdan は、変数をy辞書のキーとして使用できない理由を説明しました。両方がゼロの場合、定義時に 4 つのキーすべてが (0,0) になるため、ディクショナリにはケースが 1 つだけ含まれます。xテストの結果をy辞書のキーとして使用することで、おそらく目的を達成できます(テストされていません)。

case_dict = {(True, True): Case1,
             (True, False): Case2,
             (False, True): Case3,
             (False, False): Case4,
            }  

case_dict[(x == 0, y == 0)]() 

dictこれは組み込み型の名前であるため、 variable を呼び出すべきではないことに注意してください。

于 2013-10-09T11:35:10.357 に答える
1

x=0 と y=0 とします。dict の最後のエントリは (x,y):Case4、または 0,0 で、以前の 0,0 を置き換えます。次に、dict[x,y]、または実際には dict[0,0] を検索して、Case4 を呼び出します...これは、x,y が何であるかに関係なく発生します。

オリジナルにこだわるif。コードは明確ですが、もっと単純にすることもできます:

     if x==0 and y==0:    
        print 1    
     elif x==0:    
        print y*y+2    
     elif y==0:    
        print x*x+3    
     else:    
        print x*x+y*y+4    
于 2013-10-09T11:33:48.750 に答える