Работа со строками в python. готовимся к собеседованию: вспоминаем азы
Содержание:
- 5.8. Comparing Sequences and Other Types¶
- Проверяет, что все элементы в последовательности True.
- Другие методы для работы со строками в Python
- Сложность строковых операций
- Задания для самоподготовки
- Бинарный поиск
- Увлечения и хобби – есть ли разница
- Using find() method with default values
- Последние добавленные или измененные записи:
- 5 функций для отладки
- Позиции файла
- re.match(pattern, string)
- To find the total occurrence of a substring
- Поисковые системы
- Функция zip
- Синтаксис
- Python NumPy
- Замена в строке
- Заключение
5.8. Comparing Sequences and Other Types¶
Sequence objects typically may be compared to other objects with the same sequence
type. The comparison uses lexicographical ordering: first the first two
items are compared, and if they differ this determines the outcome of the
comparison; if they are equal, the next two items are compared, and so on, until
either sequence is exhausted. If two items to be compared are themselves
sequences of the same type, the lexicographical comparison is carried out
recursively. If all items of two sequences compare equal, the sequences are
considered equal. If one sequence is an initial sub-sequence of the other, the
shorter sequence is the smaller (lesser) one. Lexicographical ordering for
strings uses the Unicode code point number to order individual characters.
Some examples of comparisons between sequences of the same type:
(1, 2, 3) < (1, 2, 4) 1, 2, 3 < 1, 2, 4 'ABC' < 'C' < 'Pascal' < 'Python' (1, 2, 3, 4) < (1, 2, 4) (1, 2) < (1, 2, -1) (1, 2, 3) == (1.0, 2.0, 3.0) (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
Note that comparing objects of different types with or is legal
provided that the objects have appropriate comparison methods. For example,
mixed numeric types are compared according to their numeric value, so 0 equals
0.0, etc. Otherwise, rather than providing an arbitrary ordering, the
interpreter will raise a exception.
Footnotes
-
Other languages may return the mutated object, which allows method
chaining, such as .
Проверяет, что все элементы в последовательности True.
Описание:
Функция возвращает значение , если все элементы в итерируемом объекте — истинны, в противном случае она возвращает значение .
Если передаваемая последовательность пуста, то функция также возвращает .
Функция применяется для проверки на ВСЕХ значений в последовательности и эквивалентна следующему коду:
def all(iterable): for element in iterable if not element return False return True
Так же смотрите встроенную функцию
В основном функция применяется в сочетании с оператором ветвления программы . Работу функции можно сравнить с оператором в Python, только работает с последовательностями:
>>> True and True and True # True >>> True and False and True # False >>> all() # True >>> all() # False
Но между и в Python есть два основных различия:
- Синтаксис.
- Возвращаемое значение.
Функция всегда возвращает или (значение )
>>> all() # True >>> all(]) # False
Если в выражении все значения , то оператор возвращает ПЕРВОЕ истинное значение, а если все значения , то последнее ложное значение. А если в выражении присутствует значение , то ПЕРВОЕ ложное значение. Что бы добиться поведения как у функции , необходимо выражение с оператором обернуть в функцию .
>>> 3 and 1 and 2 and 6 # 6 >>> 3 and and 3 and [] # 0 >>> bool(3 and 1 and 2 and 6) # True >>> bool(3 and and 3 and []) # False
Из всего сказанного можно сделать вывод, что для успешного использования функции необходимо в нее передавать последовательность, полученную в результате каких то вычислений/сравнений, элементы которого будут оцениваться как или . Это можно достичь применяя функцию или выражения-генераторы списков, используя в них встроенные функции или методы, возвращающие значения, операции сравнения, оператор вхождения и оператор идентичности .
num = 1, 2.0, 3.1, 4, 5, 6, 7.9 # использование встроенных функций или # методов на примере 'isdigit()' >>> str(x).isdigit() for x in num # # использование операции сравнения >>> x > 4 for x in num # # использование оператора вхождения `in` >>> '.' in str(x) for x in num # # использование оператора идентичности `is` >>> type(x) is int for x in num # # использование функции map() >>> list(map(lambda x x > 1, num)) False, True, True, True, True, True, True
Примеры проводимых проверок функцией .
Допустим, у нас есть список чисел и для дальнейших операций с этой последовательностью необходимо знать, что все числа например положительные.
>>> num1 = range(1, 9) >>> num2 = range(-1, 7) >>> all() # True >>> all() # False
Или проверить, что последовательность чисел содержит только ЦЕЛЫЕ числа.
>>> num1 = 1, 2, 3, 4, 5, 6, 7 >>> num2 = 1, 2.0, 3.1, 4, 5, 6, 7.9 >>> all() # True >>> all() # False
Или есть строка с числами, записанными через запятую и нам необходимо убедится, что в строке действительно записаны только цифры. Для этого, сначала надо разбить строку на список строк по разделителю и проверить каждый элемент полученного списка на десятичное число методом . Что бы учесть правила записи десятичных чисел будем убирать точку перед проверкой строки на десятичное число.
>>> line1 = "1, 2, 3, 9.9, 15.1, 7" >>> line2 = "1, 2, 3, 9.9, 15.1, 7, девять" >>> all() # True >>> all() # False
Еще пример со строкой. Допустим нам необходимо узнать, есть ли в строке наличие открытой И закрытой скобки?
Другие методы для работы со строками в Python
В языке Пайтон имеется большое кол-во различных методов для работы со строками. Если рассматривать их все в этой статье, то она может увеличить раза в три, а то и больше. Подробное описание работы всех методов можно найти в официальной документации к языку на сайте https://python.org/
Сложность строковых операций
Нет необходимости заучивать сложность каждой операции. Достаточно помнить, что большинство операций со строками «под капотом» делают посимвольную обработку. Если каждый символ обрабатывается за константное время O(1), то итоговая временная сложность будет O(n).
Трюк в том, чтобы понять:
- Сколько итераций цикла нужно пройти для получения результата? Иначе говоря, что есть n?
- В каких случаях цикл не нужен, либо наоборот, недостаточен.
Действие | Временная сложность |
a == b | O(n), где n — размер меньшей строки |
a.startswith(b) | O(b) |
s = «».join(arr) | O(s) |
s = a + b | O(s) |
s.split(«, «) | O(s) |
b = a | O(1) |
b = a | O(k) |
b = a | O(1), т.к. мы просто создаем второй указатель на ту же строку |
b = a | O(a). Это пример с подвохом. Такой трюк часто используется для создания независимой копии списка. Создать так копии строк можно, но бессмысленно, т.к. строки неизменяемы. Помимо времени, мы также расходуем лишние O(n) памяти. |
a.find(b) | Для поиска подстроки используется специальный алгоритм, эффективность которого зависит от данных. В среднем на случайных строках можно ожидать O(a). В худшем случае — O(a*b), как у тривиального поиска (в цикле по a делаем сравнение подстроки с b) |
re.match(expression, a) | Регулярные выражения работают медленнее поиска, но зависимость от длины строки как правило линейна, т.е. O(a). |
Задания для самоподготовки
1. Выполните
считывание данных из текстового файла через символ и записи прочитанных данных
в другой текстовый файл. Прочитывайте так не более 100 символов.
2. Пользователь
вводит предложение с клавиатуры. Разбейте это предложение по словам (считать,
что слова разделены пробелом) и сохраните их в столбец в файл.
3. Пусть имеется
словарь:
d = {«house»:
«дом», «car»: «машина»,
«tree»:
«дерево», «road»: «дорога»,
«river»:
«река»}
Необходимо
каждый элемент этого словаря сохранить в бинарном файле как объект. Затем,
прочитать этот файл и вывести считанные объекты в консоль.
Видео по теме
Python 3 #1: установка и запуск интерпретатора языка
Python 3 #2: переменные, оператор присваивания, типы данных
Python 3 #3: функции input и print ввода/вывода
Python 3 #4: арифметические операторы: сложение, вычитание, умножение, деление, степень
Python 3 #5: условный оператор if, составные условия с and, or, not
Python 3 #6: операторы циклов while и for, операторы break и continue
Python 3 #7: строки — сравнения, срезы строк, базовые функции str, len, ord, in
Python 3 #8: методы строк — upper, split, join, find, strip, isalpha, isdigit и другие
Python 3 #9: списки list и функции len, min, max, sum, sorted
Python 3 #10: списки — срезы и методы: append, insert, pop, sort, index, count, reverse, clear
Python 3 #11: списки — инструмент list comprehensions, сортировка методом выбора
Python 3 #12: словарь, методы словарей: len, clear, get, setdefault, pop
Python 3 #13: кортежи (tuple) и операции с ними: len, del, count, index
Python 3 #14: функции (def) — объявление и вызов
Python 3 #15: делаем «Сапер», проектирование программ «сверху-вниз»
Python 3 #16: рекурсивные и лямбда-функции, функции с произвольным числом аргументов
Python 3 #17: алгоритм Евклида, принцип тестирования программ
Python 3 #18: области видимости переменных — global, nonlocal
Python 3 #19: множества (set) и операции над ними: вычитание, пересечение, объединение, сравнение
Python 3 #20: итераторы, выражения-генераторы, функции-генераторы, оператор yield
Python 3 #21: функции map, filter, zip
Python 3 #22: сортировка sort() и sorted(), сортировка по ключам
Python 3 #23: обработка исключений: try, except, finally, else
Python 3 #24: файлы — чтение и запись: open, read, write, seek, readline, dump, load, pickle
Python 3 #25: форматирование строк: метод format и F-строки
Python 3 #26: создание и импорт модулей — import, from, as, dir, reload
Python 3 #27: пакеты (package) — создание, импорт, установка (менеджер pip)
Python 3 #28: декораторы функций и замыкания
Python 3 #29: установка и порядок работы в PyCharm
Python 3 #30: функция enumerate, примеры использования
Бинарный поиск
Бинарный поиск работает по принципу «разделяй и властвуй». Он быстрее, чем линейный поиск, но требует, чтобы массив был отсортирован перед выполнением алгоритма.
Предполагая, что мы ищем значение в отсортированном массиве, алгоритм сравнивает со значением среднего элемента массива, который мы будем называть .
- Если — это тот элемент, который мы ищем (в лучшем случае), мы возвращаем его индекс.
- Если нет, мы определяем, в какой половине массива мы будем искать дальше, основываясь на том, меньше или больше значение значения , и отбрасываем вторую половину массива.
- Затем мы рекурсивно или итеративно выполняем те же шаги, выбирая новое значение для , сравнивая его с и отбрасывая половину массива на каждой итерации алгоритма.
Алгоритм бинарного поиска можно написать как рекурсивно, так и итеративно. , потому что она требует выделения новых кадров стека.
Поскольку хороший алгоритм поиска должен быть максимально быстрым и точным, давайте рассмотрим итеративную реализацию бинарного поиска:
def BinarySearch(lys, val): first = 0 last = len(lys)-1 index = -1 while (first <= last) and (index == -1): mid = (first+last)//2 if lys == val: index = mid else: if val<lys: last = mid -1 else: first = mid +1 return index
Если мы используем функцию для вычисления:
>>> BinarySearch(, 20)
То получим следующий результат, являющийся индексом искомого значения:
1
На каждой итерации алгоритм выполняет одно из следующих действий:
- Возврат индекса текущего элемента.
- Поиск в левой половине массива.
- Поиск в правой половине массива.
Мы можем выбрать только одно действие на каждой итерации. Также на каждой итерации наш массив делится на две части. Из-за этого временная сложность двоичного поиска равна O(log n).
Одним из недостатков бинарного поиска является то, что если в массиве имеется несколько вхождений элемента, он возвращает индекс не первого элемента, а ближайшего к середине:
>>> print(BinarySearch(, 4))
После выполнения этого фрагмента кода будет возвращен индекс среднего элемента:
2
Для сравнения: выполнение линейного поиска по тому же массиву вернет индекс первого элемента:
Однако мы не можем категорически утверждать, что двоичный поиск не работает, если массив содержит дубликаты. Он может работать так же, как линейный поиск, и в некоторых случаях возвращать первое вхождение элемента. Например:
>>> print(BinarySearch(, 4)) 3
Бинарный поиск довольно часто используется на практике, потому что он эффективен и быстр по сравнению с линейным поиском. Однако у него есть некоторые недостатки, такие как зависимость от оператора . Существует много других алгоритмов поиска, работающих по принципу «разделяй и властвуй», которые являются производными от бинарного поиска. Некоторые из них мы рассмотрим далее.
Увлечения и хобби – есть ли разница
Мнения людей о том, есть ли разница между понятиями хобби и увлечения во многом расходятся. Причина в том, что одни опираются исключительно на перевод иностранного слова, а другие вкладывают в понятия более глубокий смысл.
В переводе с английского hobby – увлечение, деятельность, которой занимаются для удовольствия в свободное время. Если ограничиваться только дословным переводом, то разницы между увлечением и хобби нет, а эти слова – обычные синонимы. Но русский язык богаче и глубже.
К хобби принято относить занятия, которыми человек занимается регулярно, постоянно совершенствуя свои навыки и расширяя границы. Увлеченные женщины и мужчины развиваются в любимом направлении, изучают новые техники, покупают дополнительное оборудование, чтобы двигаться дальше.
Увлечениями часто называют направления, которые привлекают человека, но в силу обстоятельств он пока не углубился в этот вид деятельности. Например, женщине нравится шить и вязать, но она занимается этим лишь изредка, потому что нет времени или настроения развиваться дальше.
Хобби – это когда не просто нравится наблюдать и интересно изучать, это активное участие и развитие в выбранном ключе. Одно дело, если нравится вышивать крестиком на больничном, а другое, когда потребность в вышивке ежедневная, а стремление достичь мастерства растет с каждым новым успехом.
Using find() method with default values
The parameters passed to find() method are substring i.e the string you want to search for, start, and end. The start value is 0 by default, and the end value is the length of the string.
In this example, we will use the find() method with default values.
The find() method will search for the substring and give the position of the very first occurrence of the substring. Now, if the substring is present multiple times in the given string, still it will return you the index or position of the first one.
Example:
mystring = "Meet Guru99 Tutorials Site.Best site for Python Tutorials!" print("The position of Tutorials is at:", mystring.find("Tutorials"))
Output:
The position of Tutorials is at: 12
Последние добавленные или измененные записи:
Функция glob() модуля glob в Python. Функция glob() модуля glob возвращает список имен путей, которые находятся в каталоге pathname, содержащей подстановочные wildcard-выражения.
Определение текущего положения в файловой системе. Описанные ниже методы позволяют получить текущий каталог или каталог пользователя, сравнивать и преобразовать путь в абсолютный. Данные методы принадлежат экземпляру, созданному из класса Path().
Список файлов в папке/каталоге по шаблону (pathlib.Path) в Python. Описанные ниже методы позволяют произвести рекурсивный обход дерева каталога и получить список файлов средствами модуля pathlib. Данные методы принадлежат экземпляру, созданному из класса Path().
Функция max() в Python, максимальное значение элемента. Функция max() вернет наибольшее число из итерируемого объекта или самое большое из двух или более переданных позиционных аргументов
Метод file.writelines() в Python, пишет список строк в файл. Метод файла file.writelines() записывает последовательность строк в файл file.
Метод file.readline() в Python, читает файл построчно. Метод файла file.readline() читает одну целую строку из файла. Конечный символ новой строки \n сохраняется в строке.
5 функций для отладки
Эти функции часто игнорируются, но будут полезны для отладки и устранения неисправностей кода.
breakpoint
Если нужно приостановить выполнение кода и перейти в командную строку Python, эта функция вам пригодится. Вызов перебросит вас в отладчик Python.
Эта встроенная функция была добавлена в Python 3.7, но если вы работаете в более старых версиях, можете получить тот же результат с помощью .
dir
Эта функция может использоваться в двух случаях:
- просмотр списка всех локальных переменных;
- просмотр списка всех атрибутов конкретного объекта.
Из примера можно увидеть локальные переменные сразу после запуска и после создания новой переменной .
Если в передать созданный список , на выходе можно увидеть все его атрибуты.
В выведенном списке атрибутов можно увидеть его типичные методы (, , и т. д.) , а также множество более сложных методов для перегрузки операторов.
vars
Эта функция является своего рода смесью двух похожих инструментов: и .
Когда вызывается без аргументов, это эквивалентно вызову , которая показывает словарь всех локальных переменных и их значений.
Когда вызов происходит с аргументом, получает доступ к атрибуту , который представляет собой словарь всех атрибутов экземпляра.
Перед использованием было бы неплохо сначала обратиться к .
type
Эта функция возвращает тип объекта, который вы ей передаете.
Тип экземпляра класса есть сам класс.
Тип класса — это его метакласс, обычно это .
Атрибут даёт тот же результат, что и функция , но рекомендуется использовать второй вариант.
Функция , кроме отладки, иногда полезна и в реальном коде (особенно в объектно-ориентированном программировании с наследованием и пользовательскими строковыми представлениями).
Обратите внимание, что при проверке типов обычно вместо используется функция. Также стоит понимать, что в Python обычно не принято проверять типы объектов (вместо этого практикуется утиная типизация)
help
Если вы находитесь в Python Shell или делаете отладку кода с использованием , и хотите знать, как работает определённый объект, метод или атрибут, функция поможет вам.
В действительности вы, скорее всего, будете обращаться за помощью к поисковой системе. Но если вы уже находитесь в Python Shell, вызов будет быстрее, чем поиск документации в Google.
Позиции файла
Метод tell указывает вам на текущую позицию в файле; Другими словами, следующее чтение или запись будет происходить на столько байтов от начала файла.
Метод seek(offset) изменяет текущую позицию в файле. Аргумент offset указывает число байтов, которые будут перемещены. Аргумент from определяет базисную позицию, откуда байты должны быть перемещены.
Если from установлено значение 0, то начало файла используется в качестве опорной позиции. Если он установлен в 1, то текущее положение используется в качестве опорной позиции. Если установлено значение 2, то конец файла будет принят в качестве опорной позиции.
Пример
Возьмем файл andreyex.txt, который мы создали выше.
#!/usr/bin/python3 # Открыть файл fo = open("andreyex.txt", "r+") str = fo.read(10) print ("Читать строку : ", str) # Проверить текущую позицию position = fo.tell() print ("Текущая позиция файла : ", position) # Переместите указатель в начало еще раз position = fo.seek(0, 0) str = fo.read(12) print ("Снова считать строку : ", str) # Закрыть открытый файл fo.close()
Это приводит к следующему результату:
Читать строку : Python - это Текущая позиция файла : 12 Снова считать строку : Python - это
re.match(pattern, string)
Метод осуществляет поиск в начале строки по заданному шаблону. Вызвав match() на строке «AV Analytics AV» с шаблоном «AV», мы получим успешный результат поиска. Но если будем искать «Analytics», результат будет отрицательным. Давайте посмотрим, как метод работает:
import re result = re.match(r'AV', 'AV Analytics Vidhya AV') print result
Итог:
<_sre.SRE_Match object at 0x0000000009BE4370>
Итак, искомая подстрока найдена. Если мы хотим вывести её содержимое, пригодится метод group()
Обратите внимание, что мы применяем «r» перед строкой шаблона, дабы показать, что это «сырая» строка
result = re.match(r'AV', 'AV Analytics Vidhya AV') print result.group()
Итог:
AV
А теперь поищем в данной строке «Analytics». Но, как уже было сказано выше, т. к. строка начинается на «AV», результат будет отрицательный:
result = re.match(r'Analytics', 'AV Analytics Vidhya AV') print result
Итог:
None
Кроме того, существуют методы start() и end(), позволяющие узнать начальную и конечную позиции найденной строки.
result = re.match(r'AV', 'AV Analytics Vidhya AV') print result.start() print result.end()
Итог:
2
Данные методы бывают весьма полезны при работе со строками.
To find the total occurrence of a substring
To find the total number of times the substring has occurred in the given string we will make use of find() function. Will loop through the string using for-loop from 0 till the end of the string. Will make use of startIndex parameter for find().
Variables startIndex and count will be initialized to 0. Inside for –loop will check if the substring is present inside the string given using find() and startIndex as 0.
The value returned from find() if not -1, will update the startIndex to the index where the string is found and also increment the count value.
Here is the working example:
my_string = "test string test, test string testing, test string test string" startIndex = 0 count = 0 for i in range(len(my_string)): k = my_string.find('test', startIndex) if(k != -1): startIndex = k+1 count += 1 k = 0 print("The total count of substring test is: ", count )
Output:
The total count of substring test is: 6
Summary
- The Python string find() method helps to find the index of the first occurrence of the substring in the given string. It will return -1 if the substring is not present.
- The parameters passed to find() method are substring i.e the string you want to search for, start, and end. The start value is 0 by default, and the end value is the length of the string.
- You can search the substring in the given string and specify the start position, from where the search will begin. The start parameter can be used for the same.
- Using the start and end parameter, we will try to limit the search, instead of searching the entire string.
- The Python function rfind() is similar to find() function with the only difference is that rfind() gives the highest index for the substring given and find() gives the lowest i.e the very first index. Both rfind() and find() will return -1 if the substring is not present.
- The Python string index() is yet another function that will give you the position of the substring given just like find(). The only difference between the two is, index() will throw an exception if the substring is not present in the string and find() will return -1.
- We can make use of find() to find the count of the total occurrence of a substring in a given string.
Поисковые системы
Функция zip
Следующая весьма
полезная функция позволяет объединять между собой соответствующие элементы
упорядоченных коллекций. Например, у нас имеется два списка:
a = 1,2,3,4 b = 5,6,7,8
И вызывая для
них функцию zip:
it = zip(a, b) print(it)
Получим
итератор, который возвращает следующую коллекцию:
print( list(it ) )
и мы увидим:
То есть, у нас
были объединены в кортеж соответствующие элементы этих двух списков.
Давайте теперь
добавим еще один итерируемый объект – строку:
c = "abracadabra"
И вызовем
функцию zip для всех этих
трех объектов:
it = zip(a, b, c) print( list(it ) )
В результате
получим коллекцию:
Смотрите, мы
здесь имеем всего четыре кортежа, в каждом из которых по три элемента. То есть,
все оставшиеся символы строки «abracadabra» были
просто отброшены. Получается, что функция zip формирует
выходной список, длина которого равна длине наименьшей из указанных коллекций.
Если, например, мы уменьшим коллекцию a до двух
элементов:
a = 1,2
то на выходе также
получим список из двух элементов:
Вот в этом и
заключается удобство этой функции: она позволяет автоматически объединить
несколько списков в наборы кортежей из соответствующих значений.
Следующие
задания для самостоятельного решения не связаны с материалом этого урока, а
охватывают все предыдущие занятия. Попробуйте реализовать их на Python и проверить
свои знания.
Синтаксис
Python NumPy
NumPy IntroNumPy Getting StartedNumPy Creating ArraysNumPy Array IndexingNumPy Array SlicingNumPy Data TypesNumPy Copy vs ViewNumPy Array ShapeNumPy Array ReshapeNumPy Array IteratingNumPy Array JoinNumPy Array SplitNumPy Array SearchNumPy Array SortNumPy Array FilterNumPy Random
Random Intro
Data Distribution
Random Permutation
Seaborn Module
Normal Distribution
Binomial Distribution
Poisson Distribution
Uniform Distribution
Logistic Distribution
Multinomial Distribution
Exponential Distribution
Chi Square Distribution
Rayleigh Distribution
Pareto Distribution
Zipf Distribution
NumPy ufunc
ufunc Intro
ufunc Create Function
ufunc Simple Arithmetic
ufunc Rounding Decimals
ufunc Logs
ufunc Summations
ufunc Products
ufunc Differences
ufunc Finding LCM
ufunc Finding GCD
ufunc Trigonometric
ufunc Hyperbolic
ufunc Set Operations
Замена в строке
Чтобы в Python заменить в строке одну подстроку на другую, применяют метод replace():
• replace(old, new): подстрока old заменяется на new;
• replace(old, new, num): параметр num показывает, сколько вхождений подстроки old требуется заменить на new.
Пример замены в строке в Python:
phone = "+1-234-567-89-10" # дефисы меняются на пробелы edited_phone = phone.replace("-", " ") print(edited_phone) # +1 234 567 89 10 # дефисы удаляются edited_phone = phone.replace("-", "") print(edited_phone) # +12345678910 # меняется только первый дефис edited_phone = phone.replace("-", "", 1) print(edited_phone) # +1234-567-89-10
Заключение
Существует множество возможных способов поиска элемента в коллекции. В этой статье мы обсудили несколько алгоритмов поиска и их реализации на Python.
Выбор используемого алгоритма зависит от данных, с которыми вы будете работать. Это ваш входной массив, который мы называли во всех наших реализациях.
- Если вы хотите выполнить поиск в несортированном массиве или найти первое вхождение искомой переменной, то лучшим вариантом будет линейный поиск.
- Если вы хотите выполнить поиск в отсортированном массиве, есть много вариантов, из которых самый простой и быстрый — это бинарный поиск.
- Если у вас есть отсортированный массив, в котором вы хотите выполнить поиск без использования оператора деления, вы можете использовать либо jump search, либо поиск Фибоначчи.
- Если вы знаете, что искомый элемент, скорее всего, находится ближе к началу массива, вы можете использовать экспоненциальный поиск.
- Если ваш отсортированный массив равномерно распределен, то самым быстрым и эффективным будет интерполяционный поиск.
Если вы не уверены, какой алгоритм использовать для отсортированного массива, просто протестируйте каждый из них при помощи библиотеки time и выберите тот, который лучше всего работает с вашим dataset’ом.