The operators in and not in test for membership. x in s evaluates to
True if x is a member of s, and False otherwise. x not in s returns
the negation of x in s.
另外
The operator not in is defined to have the inverse true value of in.
y not in x在逻辑上与not y in x相同。
下面是几个例子:
'a' in [1, 2, 3]
# False
'c' in ['a', 'b', 'c']
# True
'a' not in [1, 2, 3]
# True
'c' not in ['a', 'b', 'c']
# False
l = list(range(100001))
s = set(l)
%timeit 100000 in l
%timeit 100000 in s
2.58 ms ± 58.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
101 ns ± 9.53 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
最便宜、最可读的解决方案是使用^{} 运算符(或者在您的特定情况下,使用
not in
)。如文件所述另外
y not in x
在逻辑上与not y in x
相同。下面是几个例子:
这也适用于元组,因为元组是散列的(因为它们也是不可变的):
如果RHS上的对象定义了^{} 方法,
in
将在内部调用它,如文档Comparisons部分最后一段所述。in
短路,因此如果元素位于列表的开头,in
计算速度更快:如果您想做的不仅仅是检查列表中是否有项目,还可以选择:
list.index
可用于检索项的索引。如果该元素不存在,则引发ValueError
。list.count
如果要计算出现次数,可以使用。XY问题:你考虑过
set
s吗?问自己以下问题:
如果您对这些问题的回答是“是”,则应该使用
set
。对list
s的in
成员资格测试是O(n)时间复杂度。这意味着python必须对列表进行线性扫描,访问每个元素并将其与搜索项进行比较。如果重复执行此操作,或者如果列表很大,则此操作将产生开销。set
另一方面,对象散列它们的值以进行常量时间成员身份检查。检查也使用in
完成:如果不幸的是,您正在搜索/未搜索的元素位于列表的末尾,python将一直扫描到列表的末尾。从下面的计时可以明显看出这一点:
提醒一下,只要您正在存储和查找的元素是散列的,那么这是一个合适的选项。总之,它们要么是不可变的类型,要么是实现
__hash__
的对象。错误可能在代码的其他地方,因为它应该工作正常:
或使用元组:
相关问题 更多 >
编程相关推荐