Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,当引用一个列表时,是否可以快速检查一个值是否等于另一个值?_Python_List_If Statement_Tuples - Fatal编程技术网

在python中,当引用一个列表时,是否可以快速检查一个值是否等于另一个值?

在python中,当引用一个列表时,是否可以快速检查一个值是否等于另一个值?,python,list,if-statement,tuples,Python,List,If Statement,Tuples,我想检查输入值是否等于列表中的值,而不必检查列表中的每个值 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)

这实际上是一个元组而不是列表。但是,是的,你可以使用会员资格测试

使用元组:

对于列表也同样适用:

有关成员资格测试的更多信息,请参阅页面底部:

集合成员资格测试中的和未测试中的运算符。x英寸s 如果x是集合s的成员,则计算为true,如果为false,则计算为false 否则x不在s中返回x在s中的求反。藏品 隶属度测试传统上被绑定到序列上;物件 如果集合是序列,则为集合的成员,并且 包含与该对象相等的元素。然而,这对我们来说是有意义的 许多其他对象类型支持成员资格测试,而不是 序列特别是,键和集的字典支持 成员资格测试


这实际上是一个元组而不是列表。但是,是的,你可以使用会员资格测试

使用元组:

对于列表也同样适用:

有关成员资格测试的更多信息,请参阅页面底部:

集合成员资格测试中的和未测试中的运算符。x英寸s 如果x是集合s的成员,则计算为true,如果为false,则计算为false 否则x不在s中返回x在s中的求反。藏品 隶属度测试传统上被绑定到序列上;物件 如果集合是序列,则为集合的成员,并且 包含与该对象相等的元素。然而,这对我们来说是有意义的 许多其他对象类型支持成员资格测试,而不是 序列特别是,键和集的字典支持 成员资格测试


这最好用字典来完成

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()

这最好用字典来完成

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()

你有没有想过这样的事情

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]()

你有没有想过这样的事情

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]()

您可以使用序列索引方法轻松找到匹配项的索引:

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:快速告诉您指定给test的值是否等于选项中的任何值。index方法基本上做了相同的事情,但也告诉您哪一个的索引。它们之间的一个重要区别是,当值不在序列中时,index方法将抛出ValueError,而in运算符将在不匹配时返回False

因为它们非常相似,所以如图所示,两者都使用既不常见又效率低下

从代码的其余部分来看,您真正想知道的可能是基于测试值进行调度的一种好方法。正如许多其他答案所指出的,这通常是通过Python中的字典完成的,因为它没有其他编程语言中的switch或case:statement

为了补充其他示例,这里有一种在运行中构建和使用词典的新方法:

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的名称都是全局变量,因此您甚至不必构建自己的字典,因此只需使用内置globals函数返回的字典即可:

test = raw_input('enter letter: ')
try:
    globals()['func_'+test]()  # call appropriately named function
except KeyError:
    # handle illegal values of test
    ...

您可以使用序列索引方法轻松找到匹配项的索引:

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:快速告诉您指定给test的值是否等于选项中的任何值。index方法基本上做了相同的事情,但也告诉您哪一个的索引。它们之间的一个重要区别是,当值不在序列中时,index方法将抛出ValueError,而in运算符将在不匹配时返回False

因为它们非常相似,所以如图所示,两者都使用既不常见又效率低下

从代码的其余部分来看,您真正想知道的可能是基于测试值进行调度的一种好方法。正如许多其他答案所表明的那样,这通常是通过一本字典来完成的 Python,因为它没有其他编程语言中的switch或case:statement

为了补充其他示例,这里有一种在运行中构建和使用词典的新方法:

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的名称都是全局变量,因此您甚至不必构建自己的字典,因此只需使用内置globals函数返回的字典即可:

test = raw_input('enter letter: ')
try:
    globals()['func_'+test]()  # call appropriately named function
except KeyError:
    # handle illegal values of test
    ...

虽然您可以使用字典来模拟switch语句,但在本例中,对于少数条目4,使用if语句并没有什么问题

您可以使用elif语句,它是else if的缩写,以明确只执行一个分支,例如,如果它与a匹配,则没有点检查c和d

另外,mylist:check中的初始if测试在示例代码中似乎是多余的

因此可以简化为:

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"

虽然您可以使用字典来模拟switch语句,但在本例中,对于少数条目4,使用if语句并没有什么问题

您可以使用elif语句,它是else if的缩写,以明确只执行一个分支,例如,如果它与a匹配,则没有点检查c和d

另外,mylist:check中的初始if测试在示例代码中似乎是多余的

因此可以简化为:

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"

不使用list作为变量名可能是个好主意,因为Python已经有了自己的用法。此外,在本例中,您使用的是带有元组的变量列表。。可能会导致更多的混乱:1给变量列表命名是个坏主意。2您拥有的是一个元组,而不是列表。3您有一个字符元组-您也可以使用str。4您的代码无法工作,因为变量a、b、c、d尚未初始化。5如果您要对照字母进行检查,请执行if test=='a',等等,但最好在列表中执行if test。最好不要将列表用作变量名,因为Python已经有了自己的用法。此外,在本例中,您使用的是带有元组的变量列表。。可能会导致更多的混乱:1给变量列表命名是个坏主意。2您拥有的是一个元组,而不是列表。3您有一个字符元组-您也可以使用str。4您的代码无法工作,因为变量a、b、c、d尚未初始化。5如果您正在检查字母,则执行if test='a',等等-但您最好在列表中执行if test这可能作为try/except块更好。EAFP与LBYL。e、 g.try:index=choices.indextest;做点什么指标;除数值误差外;pass@mgilson:我本来打算这么做的,但后来注意到他们已经在选项中进行了if测试:这意味着它永远不会出现。globals是一个有趣的技巧,我很高兴你指出了这一点,但我不喜欢它,因为1它强制函数的命名约定,这可能没有意义;2更重要的是,它打开了一个假设函数func_e,该函数可能已经创建,但不打算在此块中使用。这两种方法可能都不会导致问题,但最好记住这些方法,将名称空间限制为只包含所需的内容。EAFP与LBYL。e、 g.try:index=choices.indextest;做点什么指标;除数值误差外;pass@mgilson:我本来打算这么做的,但后来注意到他们已经在选项中进行了if测试:这意味着它永远不会出现。globals是一个有趣的技巧,我很高兴你指出了这一点,但我不喜欢它,因为1它强制函数的命名约定,这可能没有意义;2更重要的是,它打开了一个假设函数func_e,该函数可能已经创建,但不打算在此块中使用。这两种方法可能都不会引起问题,但最好记住这些方法,将名称空间限制为只包含需要的内容。那么,当我想使用a或b等于第一个名称时会发生什么呢?@fanjojo我将原始输入移出字典,这解决了你的问题吗?我不完全确定你在问什么…很抱歉,时间太晚了,我忘记了它是去定义块进行编码的那么,当我想用a或b等于第一个时会发生什么呢?@fanjojojo我把原始输入移出了字典,这解决了你的问题吗?我不完全确定你在问什么…很抱歉,时间太晚了,我忘记了它是去定义块进行编码的