我想知道使用in tuple
和in list
条件之间的最佳实践是什么,并知道原因,如下所示:
my_variable = 'A'
if my_variable in [2, 'A', None]:
return True
elif my_variable in (2, 'A', None):
return True
如果可能的话,列出元组/列表在这种情况下的优点/缺点。
list
和tuple
对于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
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
如果只有3个元素,则List,Tuple和Set之间的运行时差异可以忽略不计。
据我所知,Pep8风格指南对此没有任何说明,因此您可以使用您喜欢的任何一种。
其他答案遗漏的东西,就可读性而言,你可以像这样直接声明一个集合:
if my_variable in {2, 'A', None}:
print(True)