List.index() для Python, которая не генерирует исключение, когда ничего не найдено

Python list.index(x) генерирует исключение, если элемент не существует. Есть ли лучший способ сделать это, что не требует обработки исключений?

Ответ 1

Если вам все равно, где находится соответствующий элемент, используйте:

found = x in somelist

Если вам все равно, используйте LBYL стиль с условным выражением :

i = somelist.index(x) if x in somelist else None

Ответ 2

реализовать свой собственный индекс для списка?

class mylist(list):
  def index_withoutexception(self,i):
    try:
        return self.index(i)
    except:
        return -1

Итак, вы можете использовать список, а с вашим индексом - вернуть то, что вы хотите в случае ошибки.

Вы можете использовать его следующим образом:

  l = mylist([1,2,3,4,5]) # This is the only difference with a real list
  l.append(4) # l is a list.
  l.index_withoutexception(19) # return -1 or what you want

Ответ 3

Напишите функцию, которая делает то, что вам нужно:

def find_in_iterable(x, iterable):
    for i, item in enumerate(iterable):
        if item == x:
            return i
    return None

Если вам нужно только знать, существует ли элемент, но не индекс, вы можете использовать in:

x in yourlist

Ответ 4

Да, есть. Вы можете, например. сделайте что-то похожее на это:

test = lambda l, e: l.index(e) if e in l else None

который работает следующим образом:

>>> a = ['a', 'b', 'c', 'g', 'c']
>>> test(a, 'b')
1
>>> test(a, 'c')
2
>>> test(a, 't')
None

Итак, в основном, test() вернет индекс элемента (второй параметр) в пределах данного списка (первый параметр), , если он не был найден (в в этом случае он вернет None, но это может быть все, что вы найдете подходящим).

Ответ 5

Если вам все равно, где это находится в последовательности, только его присутствие, то используйте оператор in. В противном случае напишите функцию, которая реорганизует обработку исключений.

def inlist(needle, haystack):
  try:
    return haystack.index(needle)
  except ...:
    return -1

Ответ 6

надеюсь, что это поможет

lst= ','.join('qwerty').split(',') # create list
i='a'  #srch string
lst.index(i) if i in lst else None

Ответ 7

Мне нравится использовать класс Список для Web2py > , найденный в модуле хранения его пакета gluon. Модуль хранения предлагает похожие структуры списка (List) и словаря (Storage), которые не вызывают ошибок, когда элемент не найден.

Сначала загрузите источник web2py, затем скопируйте папку пакета gluon в свои пакеты-сайты установки python.

Теперь попробуйте:

>>> from gluon.storage import List
>>> L = List(['a','b','c'])
>>> print L(2)
c
>>> print L(3) #No IndexError!
None

Заметьте, что он также может вести себя как обычный список:

>>> print L[3]

Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
l[3]
IndexError: list index out of range

Ответ 8

TL; DR: Исключения - ваш друг и лучший подход к заданию, как указано.

ОП разъяснил в комментарии, что для их варианта использования на самом деле не важно знать, что такое индекс. Как принято в ответах, использование x in somelist - лучший ответ, если вам все равно.

Но я предполагаю, что, как изначальный вопрос, вы заботитесь о том, что такое индекс. В этом случае я отмечу, что все другие решения требуют сканирования списка дважды, что может привести к значительному снижению производительности.

Кроме того, как писал почтенный Раймонд Хеттингер в комментарии

Даже если бы у нас был list.find, который возвратил -1, вам все равно нужно было бы проверить, будет ли я == -1 и предпринять некоторые действия.

Поэтому я вернусь к предположению в первоначальном вопросе о том, что исключений следует избегать. Я предлагаю, чтобы исключения были вашим другом. Им нечего бояться, они неэффективны, и на самом деле вам нужно быть знакомыми с ними, чтобы написать хороший код.

Итак, я думаю, лучший ответ - просто использовать метод try-except:

try: i = somelist.index(x) except ValueError: # deal with it

"справиться с этим" означает, что вы должны делать то, что вам нужно: установите я в значение дозорного, поднимите собственное исключение, следуйте за другой ветвью кода и т.д.