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

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

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

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

5 Solutions collect form web for “Элемент проверки существует в массиве”

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

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

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

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

В python EAFP, по-видимому, является предпочтительным стилем (в отличие от LBYL, обычно предпочтительного в C). Вот фрагмент из документов, который дает пример:

В многопоточной среде подход LBYL может подвергнуть риску появление состояния гонки между «взглядом» и «прыжком». Например, код, если ключ в сопоставлении: return mapping [key] может завершиться неудачей, если другой поток удаляет ключ из сопоставления после теста, но перед поиском.

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 

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

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

EDIT : с разъяснением, новый ответ:

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

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

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

has_key работает быстро и эффективно.

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

 valueTo1={"a","b","c"} if valueTo1.has_key("a"): print "Found key in dictionary" 

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

 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 .

  • Pycharm - Как получить доступ к панели «Часы»?
  • Команда помощи Python
  • При доступе к Bigquery с использованием API Python в чем отличие использования API-интерфейса google и gcloud
  • Как использовать сеанс в Google приложении
  • Что такое Pythonic и эффективный способ разделить список на соответствующий элемент?
  • REST API в Google App Engine + Python?
  • Удаление обратных косых черт из строки
  • Печать очень большой в научной нотации в python
  • Python - лучший язык программирования в мире.