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

问题描述 投票:2回答:3

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

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

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

python list tuples condition
3个回答
2
投票

listtuple对于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

0
投票

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

0
投票

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

据我所知,Pep8风格指南对此没有任何说明,因此您可以使用您喜欢的任何一种。

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

if my_variable in {2, 'A', None}:
    print(True)
© www.soinside.com 2019 - 2024. All rights reserved.