我在Python中编写了一个带有大量OR条件的if语句。有没有一种优雅的方法来处理列表,在条件内而不是循环列表?
换句话说,什么比以下更漂亮:
if foo == 'a' or foo == 'b' or foo == 'c' or foo == 'd':
我刚刚接受了Python,这种语言让我想要写得更好。
答案 0 :(得分:7)
if foo in ('a', 'b', 'c', 'd'):
#...
我还会注意到你的回答是错误的有几个原因:
答案 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