12

Самый быстрый способ проверить наличие значения в списке

9

Какой самый быстрый способ проверить, существует ли значение в очень большом списке (с миллионами значений), и узнать его индекс?

5 ответ(ов)

21

Самый быстрый и понятный способ сделать это — использовать оператор in.

Вы также можете рассмотреть возможность использования set, но создание этого множества из вашего списка может занять больше времени, чем сэкономит время на быстром тестировании на принадлежность. Единственный способ быть уверенным — это провести хорошее бенчмаркинг. (Это также зависит от того, какие операции вам нужны.)

0

В вашем коде вы создаете словарь index, в котором сохраняются значения из списка a в качестве ключей и их индексы в качестве значений. Затем вы пытаетесь получить индекс элемента 7 из этого словаря, но поскольку 7 отсутствует в списке a, возникает исключение KeyError, и программа выведет сообщение "Not found".

Вот полный перевод вашего вопроса на русский в стиле ответов на StackOverflow:

a = [4,2,3,1,5,6]

index = dict((y,x) for x,y in enumerate(a))
try:
   a_index = index[7]
except KeyError:
   print("Не найдено")
else:
   print("Найдено")

Это будет хорошей идеей, только если список a не изменяется, и таким образом, мы можем один раз создать словарь и затем использовать его многократно. Если же a будет изменяться, пожалуйста, предоставьте больше информации о том, что вы собираетесь делать.

0

Функция check_availability проверяет, доступен ли заданный элемент в переданной коллекции. Вот сама функция:

def check_availability(element, collection: iter):
    return element in collection

Пример использования:

check_availability('a', [1, 2, 3, 4, 'a', 'b', 'c'])

В данном примере функция вернёт True, так как элемент 'a' присутствует в списке.

Что касается производительности, использование оператора in для поиска элемента в списках или других итерируемых коллекциях действительно является одним из самых быстрых и простых способов проверки наличия значения. Однако стоит отметить, что для коллекций типа set и dict поиск осуществляется быстрее, поскольку они используют хеширование. Если у вас есть необходимость в частом поиске, рассмотрите использование set для повышения эффективности.

0

Ваше приложение может выиграть от использования структуры данных под названием "фильтр Блума".

Короче говоря, фильтр Блума позволяет быстро определить, что значение ОДНОЗНАЧНО НЕ присутствует в множестве. В противном случае, вы можете сделать более медленный поиск, чтобы получить индекс значения, которое, ВОЗМОЖНО, находится в списке. Если ваше приложение чаще получает результат "не найдено", чем "найдено", добавление фильтра Блума может значительно ускорить выполнение.

Для подробной информации, на Википедии имеется хорошее описание работы фильтров Блума, а поиск в интернете по запросу "python bloom filter library" предоставит вам как минимум несколько полезных реализаций.

0

Это не код, а алгоритм для очень быстрого поиска.

Если ваш список и искомое значение — это числа, то всё довольно просто. Если строки — смотрите в конце:

  • Обозначим "n" как длину вашего списка.
  • Опциональный шаг: если вам нужен индекс элемента, добавьте второй столбец к списку с текущим индексом элементов (от 0 до n-1) — подробнее об этом позже.
  • Отсортируйте ваш список или его копию с помощью .sort().
  • Запустите цикл:
    • Сравните ваше число с элементом на позиции n/2 в списке:
      • Если больше, повторите цикл для индексов от n/2 до n.
      • Если меньше, повторите цикл для индексов от 0 до n/2.
      • Если одинаково: вы его нашли.
  • Продолжайте сужать диапазон, пока не найдете элемент или не останется только 2 числа (ниже и выше искомого).
  • Это обеспечит нахождение любого элемента максимум за 19 шагов для списка из 1.000.000 элементов (чтобы быть точным, это log₂(n)).

Если вам также нужна оригинальная позиция вашего числа, поищите его во втором, индексном столбце.

Если ваш список не состоит из чисел, метод по-прежнему работает и будет самым быстрым, но вам может понадобиться определить функцию, которая сможет сравнивать/упорядочивать строки.

Конечно, этот метод требует вложений в метод sorted(), но если вы постоянно используете один и тот же список для проверки, это может быть оправдано.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь