python中的列表内与元组内条件
我想知道使用元组中的python中的列表内与元组内条件,python,list,tuples,conditional-statements,Python,List,Tuples,Conditional Statements,我想知道使用元组中的和列表中的条件之间的最佳实践是什么,并知道原因,如下所示: my_variable = 'A' if my_variable in [2, 'A', None]: return True elif my_variable in (2, 'A', None): return True 如果可能,列出在这种情况下元组/列表的优点/缺点。list和tuple对于容器中的x检查都具有O(n)时间复杂度 但是,set对此检查有一个O(1)(大多数情况下,由于哈希冲突,
和列表中的条件之间的最佳实践是什么,并知道原因,如下所示:
my_variable = 'A'
if my_variable in [2, 'A', None]:
return True
elif my_variable in (2, 'A', None):
return True
如果可能,列出在这种情况下元组/列表的优点/缺点。list
和tuple
对于容器中的x
检查都具有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
元组
是一个不可变的序列,而列表
是一个可变的序列,这意味着元组不能更改,但列表可以更改
如果不想修改正在
中检查的数据结构,请使用
元组,否则使用列表,否则两者的行为相同
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)
在这里,
set
将是最有效的<代码>集合中的my_变量((2,'A',None))。(但这真的值得吗?见下面的评论…)在我看来,这是一个毫无意义的优化。如此微小的集合/列表/元组的构建、搜索和销毁都非常迅速,因此选择最快的集合/列表/元组并不值得it@ForceBru是,因为容器包含的元素从不超过3个;)@Chris_Rands实际上在我的例子中,容器可能非常大,只是在示例中没有提到它。@getName我想你错过了我的讽刺语气;)<代码>集合s是平均情况O(1)(哈希共谋意味着情况可能更糟)。如果你在测试中做了多个(我相信你知道这一点,但值得详细说明)@Chris_Rands我们在谈论时间复杂度时总是谈论平均情况(例如,快速排序总是被认为是O(nlogn),尽管它的最坏情况是O(n^2)),但我要补充一点。*从技术上讲,使用Set-over-List或Tuple是有区别的-对象与hash比较,而不是相等,在类中定义为uu-hash而不是u-eq__