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

Элемент проверки существует в массиве

В PHP есть функция под названием isset(), чтобы проверить, существует ли что-то (например, индекс массива) и имеет значение. Как насчет Python?

Мне нужно использовать это на массивах, потому что иногда иногда меняет индекс IndexError: list out of range.

Я думаю, я мог бы использовать try/catching, но это последнее средство.

4b9b3361

Ответ 1

Посмотрите, прежде чем прыгнуть (LBYL):

if idx < len(array):
    array[idx]
else:
    # handle this

Проще просить прощения, чем разрешения (EAFP):

try:
    array[idx]
except IndexError:
    # handle this

В Python EAFP кажется популярным и предпочтительным стилем (потому что он, как правило, более надежный). Таким образом, при прочих равных условиях я рекомендую в этом случае использовать версию try/except версии - не рассматривайте ее как "последнее средство".

Этот отрывок взят из официальных документов, связанных выше, одобряющих использование try/кроме управления потоком:

Этот общий стиль кодирования Python предполагает наличие допустимых ключей или атрибутов и перехватывает исключения, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества попыток, кроме заявлений.

Ответ 2

EAFP против LBYL

Я понимаю вашу дилемму, но Python - это не PHP и стиль кодирования, известный как Легче просить прощения, чем для разрешения (или EAFP) общий стиль кодирования в Python.

См. источник (из документация):

EAFP - проще просить прощения, чем разрешения. Этот общий стиль кодирования Python предполагает наличие допустимых ключей или атрибутов и исключение исключений, если предположение оказывается ложным. Этот чистый и быстрый стиль характеризуется наличием множества попыток и исключений. Этот метод контрастирует со стандартом LBYL, общим для многих других языков, таких как C.

Итак, в принципе, использование утверждений try-catch здесь не является последним средством; это обычная практика.

"Массивы" в Python

PHP имеет ассоциативные и неассоциативные массивы, Python имеет списки, кортежи и словари. Списки похожи на неассоциативные массивы PHP, словари аналогичны ассоциативным массивам PHP.

Если вы хотите проверить, существует ли "ключ" в "массиве", вы должны сначала указать, какой тип в Python он есть, потому что они бросают разные ошибки, когда "ключ" отсутствует:

>>> l = [1,2,3]
>>> l[4]

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

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    d[4]
KeyError: 4

И если вы используете стиль кодирования EAFP, вы должны просто уловить эти ошибки соответствующим образом.

Стиль кодирования LBYL - проверка наличия индексов

Если вы настаиваете на использовании подхода LBYL, это решения для вас:

  • для списков просто проверьте длину, а если possible_index < len(your_list), то your_list[possible_index] существует, в противном случае это не так:

    >>> your_list = [0, 1, 2, 3]
    >>> 1 < len(your_list) # index exist
    True
    >>> 4 < len(your_list) # index does not exist
    False
    
  • для словарей вы можете использовать ключевое слово in, а если possible_index in your_dict, то your_dict[possible_index] существует, в противном случае это не так:

    >>> your_dict = {0: 0, 1: 1, 2: 2, 3: 3}
    >>> 1 in your_dict # index exists
    True
    >>> 4 in your_dict # index does not exist
    False
    

Помогло ли это?

Ответ 3

`e` in ['a', 'b', 'c']  # evaluates as False
`b` in ['a', 'b', 'c']  # evaluates as True

РЕДАКТИРОВАТЬ: с разъяснением новый ответ:

Обратите внимание, что массивы PHP значительно отличаются от Python, объединяя массивы и dicts в одну запутанную структуру. Массивы Python всегда имеют индексы от 0 до len(arr) - 1, поэтому вы можете проверить, находится ли ваш индекс в этом диапазоне. try/catch - хороший способ сделать это питонически.

Если вы спрашиваете о хэш-функциональности PHP-массивов (Python dict), тогда мой предыдущий ответ все еще выглядит следующим образом:

`baz` in {'foo': 17, 'bar': 19}  # evaluates as False
`foo` in {'foo': 17, 'bar': 19}  # evaluates as True

Ответ 4

has_key является быстрым и эффективным.

Вместо массива используйте хеш:

valueTo1={"a","b","c"}

if valueTo1.has_key("a"):
        print "Found key in dictionary"

Ответ 5

Вы можете использовать встроенную функцию dir() для создания аналогичного поведения для PHP isset(), что-то вроде:

if 'foo' in dir():  # returns False, foo is not defined yet.
    pass

foo = 'b'

if 'foo' in dir():  # returns True, foo is now defined and in scope.
   pass

dir() возвращает список имен в текущей области, дополнительную информацию можно найти здесь: http://docs.python.org/library/functions.html#dir.