根据列表写入条件

时间:2010-09-22 21:12:10

标签: python list

我在Python中编写了一个带有大量OR条件的if语句。有没有一种优雅的方法来处理列表,在条件内而不是循环列表?

换句话说,什么比以下更漂亮:

if foo == 'a' or foo == 'b' or foo == 'c' or foo == 'd':

我刚刚接受了Python,这种语言让我想要写得更好。

4 个答案:

答案 0 :(得分:7)

if foo in ('a', 'b', 'c', 'd'):
    #...

我还会注意到你的回答是错误的有几个原因:

  1. 你应该删除括号.. python确实需要外部的,它需要空间。
  2. 您使用的是赋值运算符,而不是相等运算符(=,而不是==)
  3. 你的意思是写为foo =='a'或foo =='b'或......,你写的不太正确。

答案 1 :(得分:2)

if foo in ("a", "b", "c", "d"):
当然,

in适用于大多数容器。您可以检查字符串是否包含子字符串("foo" in "foobar"),或者dict是否包含某个键("a" in {"a": "b"}),或许多类似的东西。

答案 2 :(得分:2)

checking_set = set(("a", "b", "c", "d")) # initialisation; do this once

if foo in checking_set: # when you need it

优点:(1)给出一组允许值,如果条目数量很大,名称(2)可能会更快

编辑一些时间响应“通常慢得多”时只有“少数条目”评论:

>python -mtimeit -s"ctnr=('a','b','c','d')" "'a' in ctnr"
10000000 loops, best of 3: 0.148 usec per loop

>python -mtimeit -s"ctnr=('a','b','c','d')" "'d' in ctnr"
1000000 loops, best of 3: 0.249 usec per loop

>python -mtimeit -s"ctnr=('a','b','c','d')" "'x' in ctnr"
1000000 loops, best of 3: 0.29 usec per loop

>python -mtimeit -s"ctnr=set(('a','b','c','d'))" "'a' in ctnr"
10000000 loops, best of 3: 0.157 usec per loop

>python -mtimeit -s"ctnr=set(('a','b','c','d'))" "'d' in ctnr"
10000000 loops, best of 3: 0.158 usec per loop

>python -mtimeit -s"ctnr=set(('a','b','c','d'))" "'x' in ctnr"
10000000 loops, best of 3: 0.159 usec per loop

(Python 2.7,Windows XP)

答案 3 :(得分:1)

>>> foo = 6
>>> my_list = list(range(10))
>>> my_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print any(foo == x for x in my_list)
True
>>> my_list = list(range(0))
>>>  print any(foo == x for x in my_list)
False

可替换地:

>>> foo = 6
>>> my_list = set(range(10))
>>> foo in my_list
True
>>> my_list = set(range(0))
>>> foo in my_list
False