Найти значение в списке
Проблема: Дублирование вопроса о проверке наличия элемента в списке
У меня есть вопрос о том, является ли конструкция 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)
или читайте их, если это необходимо.
Почему используется string.join(list), а не list.join(string)?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как вернуть ключи словаря в виде списка в Python?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как преобразовать строковое представление списка в список?