我想检查输入值是否等于列表中的值,而无需遍历列表中的每个值。
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()
这实际上是一个元组而不是一个列表。但是,是的,您可以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
与 a 相同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 和 not in 测试集合成员资格。如果 x 是集合 s 的成员,则 x in s 评估为 true,否则为 false。x not in s 返回 x in s 的否定。集合成员资格测试传统上与序列绑定。如果集合是一个序列并且包含与该对象相等的元素,则该对象是该集合的成员。但是,对于许多其他对象类型来说,支持成员资格测试而不是序列是有意义的。特别是,字典(用于键)和集合支持成员资格测试。
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
(我将示例代码中命名的变量的名称更改为,choices
因为list
它是 Python 中基本类型的预定义名称——除此之外,该变量实际上包含一个值元组,而不是它们的列表,因为它们包含在括号而不是方括号。)
if test in choices:
快速告诉您分配给的值是否test
等于choices
. 该index()
方法基本上做同样的事情,但也告诉你哪个索引。它们之间的一个重要区别是,当值不在序列中时,该index()
方法将抛出 a ValueError
,而如果没有匹配,则in
运算符将返回。False
由于它们非常相似,因此如图所示同时使用它们是不常见的(而且效率低下)。
从您的其余代码看来,您真正想知道的是一种基于test
. 正如许多其他答案所表明的那样,这通常是用 Python 中的字典完成的,因为它在其他编程语言中没有switch
orcase:
语句。
添加到其他示例中,这是一种即时构建和使用一个(字典)的有点新颖的方法:
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
...
另一种选择,因为func_x
's 定义的名称都是全局变量,这使您甚至不必构建自己的字典,因此只使用内置 globals()
函数返回的名称:
test = raw_input('enter letter: ')
try:
globals()['func_'+test]() # call appropriately named function
except KeyError:
# handle illegal values of test
...
你有没有想过这样的事情?
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
语句(“else if”的缩写)来明确只有一个分支将被执行(例如,如果它匹配“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"