リスト内のすべての値を調べずに、入力値がリスト内の値と等しいかどうかを確認したいと思います。
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)
リスト内のすべての値を調べずに、入力値がリスト内の値と等しいかどうかを確認したいと思います。
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)
これは辞書を使った方が良いでしょう。
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()
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
それらは非常に類似しているため、示されているように両方を使用することはまれです(非効率的です)。
コードの残りの部分から、おそらくあなたが本当に知りたかったのは、の値に基づいてディスパッチする良い方法であるように見えますtest。switch他の多くの回答が示すように、他のプログラミング言語にはまたは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
...
これは実際にはリストではなくタプルです。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の否定を返します。コレクションメンバーシップテストは、伝統的にシーケンスにバインドされてきました。コレクションがシーケンスであり、そのオブジェクトと等しい要素が含まれている場合、オブジェクトはコレクションのメンバーです。ただし、他の多くのオブジェクトタイプが、シーケンスでなくてもメンバーシップテストをサポートすることは理にかなっています。特に、辞書(キー用)とセットはメンバーシップテストをサポートします。
こんなことを考えていたのでしょうか?
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]()
辞書を使って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"