Как проверить, существует ли индекс списка?

Кажется, что

if not mylist[1]:
    return False

Не работает.

Ответы

Ответ 1

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

if 0 <= index < len(list):

он внутренне оценивается как

if (0 <= index) and (index < len(list)):

Итак, это условие проверяет, находится ли индекс в пределах диапазона [0, длина списка).

Примечание. Python поддерживает отрицательную индексацию. Цитирование Python документации,

Если i или j отрицательно, индекс относится к концу строки: len(s) + i или len(s) + j заменяется. Но обратите внимание, что -0 все равно 0.

Это означает, что всякий раз, когда вы используете отрицательную индексацию, значение будет добавлено к длине списка, и результат будет использоваться. Таким образом, list[-1] предоставит вам элемент list[-1 + len(list)].

Итак, если вы хотите разрешить отрицательные индексы, то вы можете просто проверить, не превышает ли индекс индекс длины, например этот

if index < len(list):

Другой способ сделать это, кроме IndexError, как этот

a = []
try:
    a[0]
except IndexError:
    return False
return True

Когда вы пытаетесь получить доступ к элементу с недопустимым индексом, создается IndexError. Таким образом, этот метод работает.


Примечание. У метода, упомянутого в вопросе, есть проблема.

if not mylist[1]:

Допустим, что 1 является допустимым индексом для mylist, и если он возвращает значение Falsy. Тогда not будет отрицать это, поэтому условие if будет оцениваться как Truthy. Таким образом, он вернет False, даже если элемент действительно присутствует в списке.

Ответ 2

В стиле EAFP Python:

try:
    mylist[1]
except IndexError:
    print "Index doesn't exist!"

Ответ 3

В случае целых индексированных списков я просто делал

if 1 < len(mylist):
  ...

Для dicts вы можете, конечно,

if key in mydict:
  ...

Ответ 4

Альтернативный (но несколько более медленный) способ сделать это:

if index not in range(len(myList)):
    return False

Это становится немного более многословным при учете отрицательных показателей:

if index not in range(-len(myList), len(myList)):
    return False