列表上的`in` 运算符与具有多个条件的`or` 运算符-python

Phi*_*son 2 python if-statement

我最近在一个班级上经常使用 python3 并发现你可以写

if x in [1,2,3]:
    print("x is 1,2 or 3")
Run Code Online (Sandbox Code Playgroud)

代替

if x == 1 or x == 2 or x ==3:
    print("x is 1,2 or 3")
Run Code Online (Sandbox Code Playgroud)

这被认为是好的还是坏的做法,它是“pythonic”吗?

编辑

共识似乎是

if x in {1,2,3}: # set {}, not list []
    print("x is 1,2 or 3")
Run Code Online (Sandbox Code Playgroud)

效率更高,O(1) vs O(n),因此更快。此外,它不那么冗长地表达了相同的东西,这也使它更加“pythonic”。

U10*_*ard 5

特尔;博士:

是的。

更长的答案:

正如@Selcuk 在评论中提到的那样,它的效率肯定不会降低:

性能差异来自实现开销,否则它们都是O(n)set操作实际上更快O(1)

听力设置应该会让你感到困惑,首先通读所有内容,最后你会看到set成员资格测试,以下是时间安排:

from timeit import timeit
x = 2
print(timeit(lambda: x in [1, 2, 3], number=10000000))
print(timeit(lambda: x == 1 or x == 2 or x == 3, number=10000000))
Run Code Online (Sandbox Code Playgroud)

输出:

2.9532112044043597
3.614175814476062
Run Code Online (Sandbox Code Playgroud)

所以这意味着,你的第一个列表成员测试解决方案比多个or条件更快。

正如@Austin 所提到的,set成员资格测试速度更快。

因此,如果我们检查set会员时间,例如:

from timeit import timeit
x = 2
print(timeit(lambda: x in {1, 2, 3}, number=10000000))
Run Code Online (Sandbox Code Playgroud)

它会输出:

2.7767165870317445
Run Code Online (Sandbox Code Playgroud)

所以set会员是最快的。