繁体   English   中英

在python中的元组条件中的列表VS中

[英]in list VS in tuple condition in python

我想知道使用in tuplein list条件之间的最佳实践是什么,并知道原因,如下所示:

my_variable = 'A'
if my_variable in [2, 'A', None]:
    return True
elif my_variable in (2, 'A', None):
    return True

如果可能的话,在这种情况下列出元组/列表的优点/缺点。

listtuple x in container检查中对于x in container时间复杂度均为 O(n)。

但是, set有一个 O(1) 用于此检查(大多数情况下,由于哈希冲突,最坏的情况将具有更糟糕的时间复杂度)。

查看列表、元组和包含 100 万个元素的集合的这些时间:

from timeit import Timer

li = list (range(1, 1000000))
t =  tuple(range(1, 1000000))
s =  set  (range(1, 1000000))

def x_in_list():
    999999 in li

def x_in_tuple():
    999999 in t

def x_in_set():
    999999 in s

print(min(Timer(x_in_list).repeat(5, 5)))
print(min(Timer(x_in_tuple).repeat(5, 5)))
print(min(Timer(x_in_set).repeat(5, 5)))

输出

0.08769642199999961
0.09637485699999981
9.329999999252436e-07

如果只有 3 个元素,则 List、Tuple 和 Set 之间的运行时差异可以忽略不计。

据我所知,Pep8 样式指南对此没有任何说明,因此您可以使用任何您喜欢的方式。

就可读性而言,其他答案遗漏的东西是您可以像这样直接声明一个集合:

if my_variable in {2, 'A', None}:
    print(True)

tuple是不可变序列,而list是可变序列,这意味着元组不能更改,但列表可以。

如果您不想修改正在签in的数据结构,请使用tuple ,否则使用 list,否则两者的行为相同。

my_variable = 'A'

if my_variable in [2, 'A', None]:
    print(True)
if my_variable in (2, 'A', None):
    print(True)

输出将是

True
True

请注意,列表和元组都有O(n)时间复杂度要检查,要获得平均O(1)复杂度,请使用集合。

if my_variable in set([2, 'A', None]):
    print(True)
#True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM