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

这实际上是一个元组而不是一个列表。但是,是的,您可以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 的否定。集合成员资格测试传统上与序列绑定。如果集合是一个序列并且包含与该对象相等的元素,则该对象是该集合的成员。但是,对于许多其他对象类型来说,支持成员资格测试而不是序列是有意义的。特别是,字典(用于键)和集合支持成员资格测试。

于 2012-07-10T21:14:30.423 回答
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(我将示例代码中命名的变量的名称更改为,choices因为list它是 Python 中基本类型的预定义名称——除此之外,该变量实际上包含一个值元组,而不是它们的列表,因为它们包含在括号而不是方括号。)

if test in choices:快速告诉您分配给的值是否test等于choices. 该index()方法基本上做同样的事情,但也告诉你哪个索引。它们之间的一个重要区别是,当值不在序列中时,该index()方法将抛出 a ValueError,而如果没有匹配,则in运算符将返回。False

由于它们非常相似,因此如图所示同时使用它们是不常见的(而且效率低下)。

从您的其余代码看来,您真正想知道的是一种基于test. 正如许多其他答案所表明的那样,这通常是用 Python 中的字典完成的,因为它在其他编程语言中没有switchorcase:语句。

添加到其他示例中,这是一种即时构建和使用一个(字典)的有点新颖的方法:

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
    ...
于 2012-07-10T21:34:00.797 回答
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语句(“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"
于 2012-07-12T21:16:34.430 回答