Python如何使用in
关键字检查迭代中是否存在给定值。它是否执行线性搜索?喜欢:
def naive(iterable, val):
for i in range(len(l)):
if iterable[i]==val:
return True
return False
?或者它有不同的方式。除了线性搜索?
答案 0 :(得分:11)
Python的in
运算符调用容器上的__contains__
魔术函数。对于不同的容器,这是以不同的方式实现的。
对于str
,list
和tuple
s,它是线性搜索(O(N)
),但由于它是在C中实现的,因此它可能比在你的问题中你有纯蟒蛇。
对于set
和dict
,它是一个哈希表查找,速度更快(O(1)
平均情况)。
其他容器将具有不同的性能特征。我不认为标准库中有任何内容,但平衡的树数据结构可能是O(log N)
。
答案 1 :(得分:8)
in
关键字取决于您正在调用的对象类中__contains__
方法的实现。这意味着对于任何不可清除的内容(列表,字符串),它执行线性搜索,但对于可清洗的数据结构(dict,set),它将按照常量时间进行摊销。
答案 2 :(得分:3)
如果它是线性数据结构,那么它就是线性搜索。示例:列表,字符串。如果它是一个设置,那么它是一个O(1)
操作,或者如果我们检查一个键是否在一个字典中也是O(1)
。