Есть ли способ сохранить индекс списка без попытки catch? - PullRequest
0 голосов
/ 01 июля 2018

Я хотел бы знать, есть ли безопасный и быстрый способ получения индекса элемента в списке в Python 3.

Идея:

# how I do it 
try:
    test_index = [1,2,3].index(4) # error
except:
    # handle error


# how I would like to do it: 
test_index = [1,2,3].awesome_index(4) # test_index = -1
if test_index == -1: 
    # handle error

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

Да, я знаю, что мог бы реализовать awesome_index, просто просматривая список, но я предполагаю, что уже есть функция, которая делает именно это очень эффективным способом.

1 Ответ

0 голосов
/ 01 июля 2018

Нет такой вещи, но мне нравится ваше мышление, поэтому давайте построим на этом:

Если у вас есть только один индекс и вы создаете много запросов к нему, почему бы не поддерживать set() или dict() рядом с этим индексом?

numbers = [1,2,3]
unique_nunbers = set(numbers)

if 4 in unique_nunbers:
  return numbers.index(4)

Опция Dict:

numbers = [1,2,3]
unique_nunbers = dict(zip(numbers, range(len(numbers))))

index = unique_nunbers.get(4)
if index is None:
    # Do stuff

Ищет внутри наборов и диктует O (1), таким образом, 4 in unique_numbers почти ничего не стоит. Итерирование по всему списку на случай, если что-то не существует, является пустой операцией O (n).

Таким образом, вы получаете более эффективный код, с лучшим алгоритмом и без исключений!

Имейте в виду, что то же самое нельзя сказать о 4 in numbers, поскольку оно повторяется по всему списку.

...