Python:“IN”(列表)如何工作?

时间:2011-08-25 15:16:15

标签: python list data-structures

我有这段代码

list = ['a','b','c']

if 'b' in list:
   return "found it"
return "not found"

现在,这是如何工作的?它是否遍历比较元素的整个列表?它是否使用某种哈希函数?

此代码是否相同?

list.index('b')

5 个答案:

答案 0 :(得分:16)

in使用方法__contains__。每种容器类型以不同方式实现它对于列表,它使用线性搜索。对于dict,它使用哈希查找。

答案 1 :(得分:7)

{1}} val in list平均时间复杂度为O(n)的Python Wiki states。这意味着线性搜索。我希望list.index(val)是一样的。

毕竟,list是一个列表。如果您需要哈希表,请考虑使用setdict

答案 2 :(得分:2)

对列表中的每个项目评估一次比较。

有关Python列表(以及您发布的列表推导)的更多信息,请参阅http://effbot.org/zone/python-list.htm

答案 3 :(得分:1)

inlist.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!