Элемент проверки существует в массиве
В PHP есть функция под названием isset()
, чтобы проверить, существует ли что-то (например, индекс массива) и имеет значение. Как насчет Python?
Мне нужно использовать это на массивах, потому что иногда иногда меняет индекс IndexError: list out of range.
Я думаю, я мог бы использовать try/catching, но это последнее средство.
Ответы
Ответ 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.