9

Найти значение в списке

4

Проблема: Дублирование вопроса о проверке наличия элемента в списке

У меня есть вопрос о том, является ли конструкция if item in my_list: самым "питоническим" способом проверки наличия элемента в списке. Я использую ее следующим образом:

if item in my_list:
    print("Желаемый элемент присутствует в списке")

Недавно мой вопрос был закрыт как дублирующий, но я не совсем согласен с этим. Я считаю, что мой вопрос больше касается того, какой метод является наилучшим с точки зрения питонистики для поиска элемента в списке. Первая ответ на дублирующий вопрос действительно охватывает множество способов решения этой задачи в Python.

Однако в связанном вопросе и его ответе внимание сосредоточено преимущественно на использовании ключевого слова in в Python. Это довольно ограниченный подход в сравнении с моим вопросом, который может рассматривать более широкий спектр методов.

Я полагаю, что ответ на мой вопрос более актуален и обширен по сравнению с ответом на предложенный дублирующий вопрос.

5 ответ(ов)

17

Что касается вашего первого вопроса: конструкция 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]
2

Если вы хотите найти один элемент в списке или вернуть None, вы можете использовать значение по умолчанию в функции next. Это позволит избежать исключения StopIteration, если элемент не был найден. Вот пример:

first_or_default = next((x for x in lst if ...), None)

В этом коде, если элемент удовлетворяет условию, first_or_default получит его значение. Если же элемент не будет найден в списке, вместо этого вернется None.

0

Хотя ответ Никласа Б. достаточно исчерпывающий, иногда бывает полезно получить индекс элемента в списке, когда мы ищем этот элемент. Для этого можно использовать следующий код:

next((i for i, x in enumerate(lst) if [условие для x]), [значение по умолчанию])

Таким образом, вы сможете найти индекс первого элемента, соответствующего заданному условию, или вернуть значение по умолчанию, если элемент не найден.

0

Определение и Использование

Метод 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).

0

Вы можете использовать один из двух возможных способов поиска при работе со списком строк:

  1. Если элемент списка равен заданному элементу ('example' находится в ['one', 'example', 'two']):
if item in your_list: some_function_on_true()

Примеры:

  • 'ex' в ['one', 'ex', 'two'] => True
  • 'ex_1' в ['one', 'ex', 'two'] => False
  1. Если элемент списка похож на заданный элемент ('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) или читайте их, если это необходимо.

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