Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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