Как проверить, есть ли элемент в списке
В Python списки играют роль контейнеров, которые могут хранить любые типы данных в виде коллекции. В 32-битной системе список может содержать до 536 870 912 элементов. Поэтому иногда бывает трудно определить, есть ли определенный элемент в списке.
Проверка наличия элемента в списке является одной из основных операций со списком в Python. Не удивительно, что подобные проверки можно осуществлять разными способами. В этой статье мы рассмотрим некоторые из них.
От редакции Pythonist: если хотите побольше узнать о списках, почитайте статью «Списки в Python: полное руководство для начинающих».
Проверяем, есть ли элемент в списке, при помощи оператора in
Самый удобный способ проверить, содержит ли список определенный элемент, — это воспользоваться оператором in . Этот оператор возвращает True, если элемент есть, и False, если его нет. При этом список не сортируется.
В приведенном ниже примере показано, как применяется оператор in в условном блоке:
name_list = ["Adam", "Dean", "Harvey", "Mick", "John"] if "John" in name_list: print("'John' is found in the list") else: print("'John' is not found in the list") if 'Ned' in name_list: print("'Ned' is found in the list") else: print("'Ned' is not found in the list") # Результат: # 'John' is found in the list # 'Ned' is not found in the list
От редакции Pythonist: об операторе in , его паре not in и прочих операторах можно почитать в статье «Операторы в Python».
Использование цикла for для проверки наличия элемента в списке
Проверить, есть ли элемент в списке, можно и при помощи цикла. Этот способ также довольно прост. Цикл будет по очереди сопоставлять каждый элемент списка с искомым элементом и остановится только в случае совпадения или полного отсутствия совпадения. Пример:
name_list = ["Adam", "Dean", "Harvey", "Mick", "John"] for name in name_list: if name == 'Adam': print("Found the element") # Результат: # Found the element
Как проверить, есть ли элемент в списке, при помощи функции any()
Встроенная функция any() проверяет, оценивается ли хоть один элемент в последовательности как True.
С помощью этой функции мы можем проверить, есть ли в строке подстрока, совпадающая с каким-нибудь элементом списка.
Приведенный ниже пример показывает, как работает функция any() . Мы проверяем, содержит ли строка «Adam lives in New York» какое-нибудь из имен, хранящихся в списке из первой строки.
name_list = ["Adam", "Dean", "Harvey", "Mick", "John"] string = "Adam lives in New York" print("The original list is: " + str(name_list)) print("The original string is: " + string) result = any(item in string for item in name_list) print("Does the string contain any name from the list: " + str(result)) # Результат: # The original list is: ['Adam', 'Dean', 'Harvey', 'Mick', 'John'] # The original string is: Adam lives in New York # Does the string contain any name from the list: True
Проверяем наличие элемента в списке при помощи метода count()
Встроенный метод count() возвращает количество вхождений указанного элемента в списке. Если элемента в списке нет, то count() вернет 0. Если возвращается целое положительное число больше 0, это означает, что список содержит элемент.
name_list = ["Adam", "Dean", "Harvey", "Mick", "John"] result = name_list.count("Harvey") if result > 0: print("Harvey exists in the list") else: print("Harvey does not exist in the list") # Результат: # Harvey exists in the list
Итоги
В этой статье мы рассмотрели на примерах, как проверить, есть ли элемент в списке. Для проверок мы использовали оператор in , цикл for , методы any() и count() .
Python: проверить индекс элемента в списке
Списки полезны по-разному по сравнению с другими типами данных из-за их универсальности. В этой статье мы рассмотрим одну из самых распространенных операций со списками — поиск индекса элемента.
Мы рассмотрим различные сценарии поиска элемента, то есть нахождение первого, последнего и всех вхождений элемента. А также что происходит, когда искомого элемента не существует.
Использование Функции index()
Все операции, упомянутые в предыдущем абзаце, можно выполнить с помощью встроенной функции index() . Синтаксис этой функции:
index(element[, start[, end]])
Параметр element , естественно, представляет собой элемент который мы ищем. Параметры start и end являются необязательными и представляют диапазон индексов, в котором мы ищем element .
Значение по умолчанию для start — 0 (поиск с начала), а значение по умолчанию для end — это количество элементов в списке (поиск до конца списка).
Функция возвращает первую позицию element в списке, которую она могла найти, независимо от того, сколько равных элементов осталось после первого вхождения.
Нахождение первого появления элемента
Использование функции index() без установки каких-либо значений для start и end даст нам первое вхождение искомого element :
my_list = ['a', 'b', 'c', 'd', 'e', '1', '2', '3', 'b'] first_occurrence = my_list.index('b') print("First occurrence of 'b' in the list: ", first_occurrence)
Что даст нам ожидаемый результат:
First occurrence of 'b' in the list: 1
Поиск всех вхождений элемента
Чтобы найти все вхождения элемента, мы можем использовать необязательный параметр start , чтобы мы выполняли поиск только в определенных сегментах списка.
Например, предположим, что первое вхождение элемента в index 3 . Чтобы найти следующий, нам нужно будет продолжить поиск первого появления этого элемента после индекса 3 . Мы будем повторять этот процесс, меняя место начала поиска, пока мы найдем новые вхождения элемента:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] all_occurrences = [] last_found_index = -1 element_found = True while element_found: try: last_found_index = my_list.index('a', last_found_index + 1) all_occurrences.append(last_found_index) except ValueError: element_found = False if len(all_occurrences) == 0: print("The element wasn't found in the list") else: print("The element was found at: " + str(all_occurrences))
Запуск этого кода даст нам:
The element was found at: [1, 5, 7]
Здесь нам пришлось использовать блок try , так как функция index() выдает ошибку, когда не может найти указанный element в заданном диапазоне. Это может быть необычно для разработчиков, которые больше привыкли к другим языкам, поскольку такие функции обычно возвращают -1 / null , когда элемент не может быть найден.
Однако в Python мы должны быть осторожны и использовать блок try при использовании этой функции.
Другой, более изящный способ сделать то же самое — использовать понимание списка и полностью игнорировать функцию index() :
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] all_occurrences = [index for index, element in enumerate(my_list) if element == 'a'] print("The element was found at: " + str(all_occurrences))
Что даст нам тот же результат, что и раньше. У этого подхода есть дополнительное преимущество в том, что он не использует блок try .
Нахождение последнего появления элемента
Если вам нужно найти последнее вхождение элемента в списке, есть два подхода, которые вы можете использовать с функцией index() :
- Переверните список и найдите первое вхождение в перевернутом списке
- Просмотрите все вхождения элемента и отслеживайте только последнее вхождение
Что касается первого подхода, если бы мы знали первое вхождение element в обратном списке, мы могли бы найти позицию последнего вхождения в исходном. В частности, мы можем сделать это, вычтя reversed_list_index — 1 из длины исходного списка:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] reversed_list_index = my_list[::-1].index('n') # or alteratively: # reversed_list_index2 = list(reversed(my_list)).index('n') original_list_index = len(my_list) - 1 - reversed_list_index print(original_list_index)
Что даст нам желаемый результат:
Что касается второго подхода, мы могли бы настроить код, который мы использовали, чтобы найти все вхождения, и отслеживать только последнее обнаруженное вхождение:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] last_occurrence = -1 element_found = True while element_found: try: last_occurrence = my_list.index('n', last_occurrence + 1) except ValueError: element_found = False if last_occurrence == -1: print("The element wasn't found in the list") else: print("The last occurrence of the element is at: ", last_occurrence)
Что даст нам тот же результат:
Вывод
Мы рассмотрели некоторые из наиболее распространенных способов использования функции index() и способы избежать ошибки в некоторых случаях.
Помните о потенциально необычном поведении функции index() , когда она выдает ошибку вместо возврата -1 / None , когда элемент не найден в списке.
Проверка на существования элемента в отсортированном массиве по индексу
На входе «Х» и отсортированный список. Программка ищет индекс, на который попадет «Х» в отсортированный масив. Всё без использования библиотек, ручками(так надо). Последняя проверка проходит в следующем цикле: UPD1. Весь код:
x = int(input()) # ввод X n = int(input()) # ввод кол-ва элементов массива m = [int(input()) for i in range(0, n)] # ввод элементов массива m.sort() print(m) # вывод отсортированного списка index = int() # для записи индекса, на который встанет Х в список # сравнение с нулевым элементом if x < m[0]: index = 0 # сравнение с последним элементом if x >m[len(m) - 1]: index = len(m) - 1 j = int(0) while j != n: if x > m[j] and x < m[j + 1]: # ломается тут. при попытке сравнить "Х" с элементом j+1, которого в списке нет index = j + 1 j += 1 print(index)
Он работает как надо, но если "Х" больше, чем последни элемент списка , то ломается и выдаёт: "list index out of range". Пример входных данных:
m = [1, 2, 3] x = 4
Как можно сделать проверку на то, что существует элемент m[j + 1]?
Отслеживать
52.2k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
задан 11 апр 2017 в 7:24
41 1 1 золотой знак 2 2 серебряных знака 9 9 бронзовых знаков
Приведите для примера весь код, включая массив, пожалуйста. И что конкретно сделать надо?
– user243273
11 апр 2017 в 7:28
Боже мой. Вы скажите, конечная цель какая? В комментарии напишите
– user243273
11 апр 2017 в 7:49
@KitScribe в самом начале ведь написано, что программа ищет индекс, на который встанет Х в отсортированном масиве
11 апр 2017 в 7:51
Всё, понял, спасибо. Прошу простить мою невнимательность
– user243273
11 апр 2017 в 7:52
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Похоже вы пытаетесь реализовать index = bisect.bisect_left(m, x) , но используете линейный поиск ( O(n) ) вместо двоичного поиска ( O(log n) ).
Чтобы реализовать (линейный) алгоритм из кода в вопросе:
L = [float('-inf')] + m + [float('inf')] # add sentinels index = next(i for i, (a, b) in enumerate(zip(L, L[1:])) if a < x
Для примера в вопросе ( m = [1, 2, 3]; x = 4 ), получается index = 3 , что совпадает с ожидаемым результатом: index == sorted(m + [x]).index(x) .
Предполагается, что все числа во входном списке m больше float('-inf') (минус бесконечность) и все элементы в m меньше float('inf') (плюс бесконечность).
Так как m список отсортирован, то существует более эффективный алгоритм, который позволяет найти нужный индекс не сравнивая все элементы ( O(n) операция), а выполнив двоичный поиск за O(log n) шагов, что гораздо эффективней при большом n ( n == len(m) ). К примеру, log10(1000_000) == 6 (приблизительно шесть шагов вместо миллиона -- гораздо лучше).
def binary_search(haystack, needle, lo=0, hi=None): if hi is None: hi = len(haystack) while lo < hi: mid = (lo + hi) // 2 if haystack[mid] >needle: hi = mid elif haystack[mid] < needle: lo = mid + 1 else: return mid return hi
>>> binary_search([1, 2, 3], 4) 3
Находим индекс элемента списка в Python
Статьи
Автор Admin На чтение 2 мин Просмотров 2.3к. Опубликовано 17.03.2023
Введение
Довольно часто бывает такая ситуация, что нужно определить индекс элемента в списке. В статье ответим на вопрос, как найти индекс элемента списка в Python.
Метод index()
Самый простой способ определения индекса элемента в списке — это использование метода index().
x = ['a', 'b', 'c', 'd', 'e'] print(x.index('c')) # Вывод: 2
Проблема только в том, что сама функция index() возвращает индекс первого вхождения заданного элемента в списке. Т.е. в списке может быть несколько элементов «a», метод index() выведет индекс первого из них.
x = ['a', 'b', 'c', 'a', 'e'] print(x.index('a')) # Вывод: 0
Вывод всех вхождений элемента в список
Для вывода всех вхождений элемента в список используем генератор списка с условием, где пройдёмся по всем элементам и их индексам при помощи функции enumerate(). В условии проверим совпадение итерабельного элемента с искомым:
x = ['a', 'b', 'c', 'a', 'e'] result = [i for i, x in enumerate(x) if x == 'a'] print(f"Элемент присутствует по индекс(у/ам) ") # Вывод: Элемент a присутствует по индекс(у/ам) [0, 3]
Заключение
В ходе статьи мы с Вами научились находить индекс элемента списка в языке программирования Python. Надеюсь Вам понравилась статья, желаю удачи и успехов!