我有这段代码
list = ['a','b','c']
if 'b' in list:
return "found it"
return "not found"
现在,这是如何工作的?它是否遍历比较元素的整个列表?它是否使用某种哈希函数?
此代码是否相同?
list.index('b')
答案 0 :(得分:16)
in
使用方法__contains__
。每种容器类型以不同方式实现它对于列表,它使用线性搜索。对于dict,它使用哈希查找。
答案 1 :(得分:7)
{1}} val in list
平均时间复杂度为O(n)
的Python Wiki states。这意味着线性搜索。我希望list.index(val)
是一样的。
毕竟,list
是一个列表。如果您需要哈希表,请考虑使用set
或dict
。
答案 2 :(得分:2)
对列表中的每个项目评估一次比较。
有关Python列表(以及您发布的列表推导)的更多信息,请参阅http://effbot.org/zone/python-list.htm。
答案 3 :(得分:1)
in
和list.index()
都循环遍历所有元素,因此具有线性运行时。除了直观的逻辑(它必须是这样的,因为列表只是一个动态数组),你可以通过查看list_contains
的{strong> C实现来验证它({{1 }}和listindex
。
例如,in
例程实现简单如下:
__contains__
答案 4 :(得分:-1)
这是反汇编:
>>> from dis import dis
>>> def foo():
... a = ['a', 'b', 'c']
... if 'b' in a:
... print "Found it!"
...
>>> dis(foo)
2 0 LOAD_CONST 1 ('a')
3 LOAD_CONST 2 ('b')
6 LOAD_CONST 3 ('c')
9 BUILD_LIST 3
12 STORE_FAST 0 (a)
3 15 LOAD_CONST 2 ('b')
18 LOAD_FAST 0 (a)
21 COMPARE_OP 6 (in)
24 POP_JUMP_IF_FALSE 35
4 27 LOAD_CONST 4 ('Found it!')
30 PRINT_ITEM
31 PRINT_NEWLINE
32 JUMP_FORWARD 0 (to 35)
>> 35 LOAD_CONST 0 (None)
38 RETURN_VALUE
in-operator在COMPARE_OP指令中调用__contains__。你可以在这里看到它:
class X(object):
def __init__(self, elements):
self.elements = elements
def __contains__(self, element):
print "Called __contains__"
return element in self.elements
x = X(['a', 'b', 'c'])
if 'b' in x:
print "Found it!"
你得到这个输出:
...
>>> x = X(['a', 'b', 'c'])
>>> if 'b' in x:
... print "Found it!"
...
Called __contains__
Found it!