Найти значение в списке
Проблема: Дублирование вопроса о проверке наличия элемента в списке
У меня есть вопрос о том, является ли конструкция if item in my_list:
самым "питоническим" способом проверки наличия элемента в списке. Я использую ее следующим образом:
if item in my_list:
print("Желаемый элемент присутствует в списке")
Недавно мой вопрос был закрыт как дублирующий, но я не совсем согласен с этим. Я считаю, что мой вопрос больше касается того, какой метод является наилучшим с точки зрения питонистики для поиска элемента в списке. Первая ответ на дублирующий вопрос действительно охватывает множество способов решения этой задачи в Python.
Однако в связанном вопросе и его ответе внимание сосредоточено преимущественно на использовании ключевого слова in
в Python. Это довольно ограниченный подход в сравнении с моим вопросом, который может рассматривать более широкий спектр методов.
Я полагаю, что ответ на мой вопрос более актуален и обширен по сравнению с ответом на предложенный дублирующий вопрос.
5 ответ(ов)
Что касается вашего первого вопроса: конструкция if item in my_list:
вполне приемлема и должна работать, если item
соответствует одному из элементов в my_list
. При этом элемент должен точно совпадать с элементом в списке. Например, "abc"
и "ABC"
не совпадают. Особенно стоит быть осторожным с числами с плавающей запятой, так как они могут страдать от неточности. К примеру, 1 - 1/3 != 2/3
.
Теперь к вашему второму вопросу: на самом деле существует несколько способов "найти" вещи в списках.
Проверка наличия элемента
Это тот случай, который вы описали: проверка, находится ли что-то в списке или нет. Как вы знаете, для этого можно использовать оператор in
:
3 in [1, 2, 3] # => True
Фильтрация коллекции
Это означает поиск всех элементов в последовательности, которые соответствуют определенному условию. Для этого вы можете использовать списковое включение или выражения-генераторы:
matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)
Во втором случае будет возвращен генератор, который можно представить как своего рода «ленивый» список, который будет создан только при итерации по нему. Кстати, первое выражение эквивалентно следующему:
matches = filter(fulfills_some_condition, lst)
в Python 2. Здесь вы можете увидеть, как работают функции высшего порядка. В Python 3 filter
не возвращает список, а генератороподобный объект.
Поиск первого вхождения
Если вам нужно только первое соответствие какому-то условию (но вы не знаете, что это), вполне допустимо использовать цикл for
(возможно, с использованием также else
, который не так известен). Также можно воспользоваться
next(x for x in lst if ...)
что вернет первое соответствие или вызовет StopIteration
, если ничего не найдено. В качестве альтернативы вы можете использовать
next((x for x in lst if ...), [значение по умолчанию])
Поиск позиции элемента
Для списков также существует метод index
, который может быть полезен, если вы хотите узнать, где находится определенный элемент в списке:
[1, 2, 3].index(2) # => 1
[1, 2, 3].index(4) # => ValueError
Тем не менее, учтите, что если у вас есть дубликаты, .index
всегда возвращает наименьший индекс:
[1, 2, 3, 2].index(2) # => 1
Если же дубликатов много и вам нужны все индексы, тогда вы можете воспользоваться enumerate()
:
[i for i, x in enumerate([1, 2, 3, 2]) if x == 2] # => [1, 3]
Если вы хотите найти один элемент в списке или вернуть None
, вы можете использовать значение по умолчанию в функции next
. Это позволит избежать исключения StopIteration
, если элемент не был найден. Вот пример:
first_or_default = next((x for x in lst if ...), None)
В этом коде, если элемент удовлетворяет условию, first_or_default
получит его значение. Если же элемент не будет найден в списке, вместо этого вернется None
.
Хотя ответ Никласа Б. достаточно исчерпывающий, иногда бывает полезно получить индекс элемента в списке, когда мы ищем этот элемент. Для этого можно использовать следующий код:
next((i for i, x in enumerate(lst) if [условие для x]), [значение по умолчанию])
Таким образом, вы сможете найти индекс первого элемента, соответствующего заданному условию, или вернуть значение по умолчанию, если элемент не найден.
Определение и Использование
Метод count()
возвращает количество элементов с указанным значением.
Синтаксис
list.count(value)
Пример:
fruits = ['apple', 'banana', 'cherry']
x = fruits.count("cherry")
Пример из вопроса:
item = someSortOfSelection()
if myList.count(item) >= 1:
doMySpecialFunction(item)
В данном примере сначала происходит выбор какого-либо элемента с помощью функции someSortOfSelection()
, а затем с использованием метода count()
проверяется, встречается ли этот элемент в списке myList
хотя бы один раз. Если хотя бы одно совпадение найдено, вызывается функция doMySpecialFunction(item)
.
Вы можете использовать один из двух возможных способов поиска при работе со списком строк:
- Если элемент списка равен заданному элементу ('example' находится в ['one', 'example', 'two']):
if item in your_list: some_function_on_true()
Примеры:
- 'ex' в ['one', 'ex', 'two'] => True
- 'ex_1' в ['one', 'ex', 'two'] => False
- Если элемент списка похож на заданный элемент ('ex' находится в ['one', 'example', 'two'] или 'example_1' находится в ['one', 'example', 'two']):
matches = [el for el in your_list if item in el]
или
matches = [el for el in your_list if el in item]
Затем просто проверьте len(matches)
или читайте их, если это необходимо.
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Самый быстрый способ проверить наличие значения в списке
Преобразование всех строк в списке в целые числа
Нахождение среднего значения списка