Python list.index(x)
генерирует исключение, если элемент не существует. Есть ли лучший способ сделать это, что не требует обработки исключений?
List.index() для Python, которая не генерирует исключение, когда ничего не найдено
Ответ 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
"справиться с этим" означает, что вы должны делать то, что вам нужно: установите я в значение дозорного, поднимите собственное исключение, следуйте за другой ветвью кода и т.д.
Ответ 9
Нет встроенного способа делать то, что вы хотите сделать.
Вот хороший пост, который может вам помочь: Почему список не имеет безопасности "get" метод, как словарь?