1

リスト内のすべての値を調べずに、入力値がリスト内の値と等しいかどうかを確認したいと思います。

list=('a','b','c','d')
test=raw_input('enter letter')
if test in list:
   if test == a:
         (code)
   if test == b:
         (code)
   if test == c:
         (code)
   if test == d:
         (code)
4

5 に答える 5

6

これは辞書を使った方が良いでしょう。

def a_code():
    print "a"
def b_code():
    print "b"

d={'a':a_code,'b':b_code}
test=raw_input("enter a or b")
d[test]()

もちろん、それぞれの場合でコードが同じであれば、次のことができます。

if test in ('a', 'b', 'c', 'd'): #tuple
   do_something()

これは機能的に次のものと同等です。

if test in ['a', 'b', 'c', 'd']: #list slower than tuple -- ('a', 'b', 'c', 'd')
   do_something()

または、もっと簡単に:

if test in 'abcd': # string
   do_something()
于 2012-07-10T21:15:22.980 に答える
2

indexシーケンスの方法を使用して、一致するアイテムのインデックスを簡単に見つけることができます。

choices=('a','b','c','d')
test=raw_input('enter letter: ')
if test in choices:
    index = choices.index(test)
    # do something based on index

list(サンプルコードで名前が付けられた変数の名前を、Pythonの基本型の事前定義された名前であるchoicesために変更しましlistた。さらに、変数には値のタプルが含まれていますが、値のタプルが含まれているため、値のタプルが含まれています。角括弧の代わりに括弧。)

に割り当てられた値がのいずれかに等しいif test in choices:かどうかをすばやく通知します。この方法は基本的に同じことを行いますが、どれのインデックスも教えてくれます。それらの重要な違いの1つは、値がシーケンスにない場合、メソッドはをスローするのに対し、演算子は一致するものがない場合にのみ戻ることです。testchoicesindex()index()ValueErrorinFalse

それらは非常に類似しているため、示されているように両方を使用することはまれです(非効率的です)。

コードの残りの部分から、おそらくあなたが本当に知りたかったのは、の値に基づいてディスパッチする良い方法であるように見えますtestswitch他の多くの回答が示すように、他のプログラミング言語にはまたはcase:ステートメントがないため、これはPythonの辞書を使用して行われることがよくあります。

他の例に追加するために、オンザフライで1つ(辞書)を作成して使用するためのやや斬新な方法を次に示します。

def func_a(): pass
def func_b(): pass
def func_c(): pass
def func_d(): pass

test = raw_input('enter letter: ')
try:
    {'a': func_a,
     'b': func_b,
     'c': func_c,
     'd': func_d,
    }[test]()  # call corresponding function
except KeyError:
    # handle other values of test
    ...

もう1つの方法は、func_x定義されたの名前がす​​べてグローバル変数であるため、独自の辞書を作成する必要がないため、 globals()代わりに組み込み関数によって返される辞書を使用することです。

test = raw_input('enter letter: ')
try:
    globals()['func_'+test]()  # call appropriately named function
except KeyError:
    # handle illegal values of test
    ...
于 2012-07-10T21:34:00.797 に答える
2

これは実際にはリストではなくタプルです。inしかし、はい、これにはメンバーシップテストを使用できます。

tuple

In [1]: mtuple=('a','b','c','d')

In [2]: 'a' in mtuple
Out[2]: True

In [3]: 'z' in mtuple
Out[3]: False

でも同じように動作しlistます:

In [4]: mlist=['a','b','c','d']

In [5]: 'a' in mlist
Out[5]: True

In [6]: 'z' in mlist
Out[6]: False

ページの下部にあるinを使用したメンバーシップテストの詳細:

コレクションメンバーシップのテストに参加しているオペレーターとテストしていないオペレーター。x in sは、xがコレクションsのメンバーである場合はtrueと評価され、それ以外の場合はfalseと評価されます。sにないxは、sにあるxの否定を返します。コレクションメンバーシップテストは、伝統的にシーケンスにバインドされてきました。コレクションがシーケンスであり、そのオブジェクトと等しい要素が含まれている場合、オブジェクトはコレクションのメンバーです。ただし、他の多くのオブジェクトタイプが、シーケンスでなくてもメンバーシップテストをサポートすることは理にかなっています。特に、辞書(キー用)とセットはメンバーシップテストをサポートします。

于 2012-07-10T21:14:30.423 に答える
0

こんなことを考えていたのでしょうか?

def block_a():
    print "AAA"

def block_b():
    print "BBB"

def block_c():
    print "CCC"

d = {"A": block_a, "B" : block_b, "C" : block_c}

test=raw_input('enter letter: ')

d[test]()
于 2012-07-10T21:17:04.650 に答える
0

辞書を使ってswitchステートメントをエミュレートすることはできますが、いくつかの項目(この場合は4つ)については、ifステートメントを使用しても問題はありません。

elifステートメント(「elseif」の略)を使用して、ブランチの1つだけが実行されることを明確にすることができます(たとえば、「a」と一致する場合、cとdをチェックするポイントはありません)。

また、サンプルコードでは最初のif test in mylist:チェックが冗長に見えました

したがって、次のように簡略化できます。

things=('a','b','c','d')
test=raw_input('enter letter')

if test == "a":
    code("was called with 'a'!")
elif test == "b":
    code("was called with 'b'!")
elif test == "c":
    code("was called with 'c'!")
elif test == "d":
    code("was called with 'd'!")
else:
    # Optional else block, executed if the input wasn't a, b, c or d
    print "Uhoh"
于 2012-07-12T21:16:34.430 に答える