我想知道使用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
如果可能的话,列出这种情况下元组/列表的优点/缺点。
发布于 2019-04-29 13:16:21
对于x in container
校验,list
和tuple
的时间复杂度均为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
发布于 2019-04-29 13:39:08
如果只有3个元素,则List、Tuple和Set之间的运行时差异可以忽略不计。
据我所知,Pep8风格指南并没有提到这一点,所以你可以使用你喜欢的任何一种。
其他答案遗漏了一些东西,就可读性而言,您可以直接声明一个set,如下所示:
if my_variable in {2, 'A', None}:
print(True)
发布于 2019-04-29 13:17:08
tuple
是一个不可变的序列,而list
是一个可变的序列,这意味着元组不能改变,但是列表可以改变。
如果您不想修改正在检查列表的数据结构,请使用tuple
,否则使用in
,否则两者的行为相同。
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
https://stackoverflow.com/questions/55904156
复制