Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的列表内与元组内条件_Python_List_Tuples_Conditional Statements - Fatal编程技术网

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__