Имеет ли оператор Python «in» для списков ранний выход для успешного поиска

Если у меня есть список, я ищу элемент в списке:

alist=[ele1, ele2, ele3, ele4,ele5,...]
if ele3 in alist:
  print "found" 

Будет ли остановлен поиск из списка на ele3? Или он будет работать через весь оставшийся элемент до конца.

Заранее спасибо!


person thangnv    schedule 06.08.2014    source источник
comment
Реализация определена, я полагаю; но это должна быть довольно глупая реализация, чтобы не вернуться раньше.   -  person Blorgbeard    schedule 06.08.2014
comment
Этот не дубликат предложенного вопроса. Этот вопрос касается временной сложности, но это не помогает, поскольку независимо от того, завершится ли Python досрочно, в наихудшем случае сложность будет равна O(n); знание того, что это O(n), ничего не говорит вам о том, выйдет ли Python раньше.   -  person icktoofay    schedule 06.08.2014


Ответы (4)


Будет ли остановлен поиск из списка на ele3?

Да, оператор in в списке выполняет линейный поиск с ранним выходом, если цель найдена. Кроме того, окончательное сравнение будет пропущено, если целевой объект идентичен объекту в списке.

Вот некоторый код трассировщика, который подтверждает результат, делая сравнения видимыми:

class Int(int):
    'Make comparisons visible'
    def __cmp__(self, other):
        print 'Comparing %s to %d' % (self, other)
        return int.__cmp__(self, other)

ele1 = Int(1)
ele2 = Int(2)
ele3 = Int(3)
ele4 = Int(4)
ele5 = Int(5)

alist = [ele1, ele2, ele3, ele4, ele5]
if ele3 in alist:
  print "found" 

Результат:

Comparing 3 to 1
Comparing 3 to 2
found

Python переводит оператор in в выражении ele3 in alist в магический вызов метода например alist.__contains__(ele3). Метод list.__contains__() работает как это:

def __contains__(self, target):
    for element in self:
        if target is element or target == element:
            return True
    return False

Надеюсь, это сделает процесс кристально чистым :-)

person Raymond Hettinger    schedule 06.08.2014

in прекратите поиск в списке, как только он найдет элемент.

Источник

person Avinash Raj    schedule 06.08.2014
comment
Вы могли бы иметь источник для этого утверждения. . - person icktoofay; 06.08.2014

Ваша цель условия if ele3 in alist: состоит в том, чтобы проверить ele3 существование в списке или нет. Как только он найдет, нет необходимости обрабатывать другой элемент.

Нравится, если у вас есть условие

False and True

если первый элемент равен False, тогда нет необходимости обрабатывать оператор rest. Потому что какой бы ни был оставшийся оператор, он всегда будет False.

То же правило применяется к вашему условию: после нахождения нет необходимости обрабатывать другой элемент.

person Nilesh    schedule 06.08.2014

В основном оператор «In» работает так же, как эта функция:

def IsInEnumerable(element, enumerable):
    for e in enumerable:
        if e == element:
            return True

    return False

IsInEnumerable('test', ['foo', 'test', 'bar', 'meow', 'quack']) # True

Как видите, будет всего две итерации цикла for. То же самое верно и при использовании оператора «in».

person rufanov    schedule 06.08.2014