Python: найти в списке

Я сталкивался с этим:

item = someSortOfSelection()
if item in myList:
    doMySpecialFunction(item)

но иногда это не работает со всеми моими элементами, как будто они не были распознаны в списке (когда это список строк).

Является ли это наиболее "питоническим" способом поиска элемента в списке: if x in l: :?

Ответ 1

Что касается вашего первого вопроса: этот код отлично подходит и должен работать, если item равен одному из элементов внутри myList. Возможно, вы пытаетесь найти строку, которая точно не соответствует одному из элементов, или, может быть, вы используете значение float, которое имеет неточность.

Что касается вашего второго вопроса: на самом деле существует несколько возможных способов, если "найти" вещи в списках.

Проверка того, что-то внутри

Это пример использования, который вы описываете: проверка наличия внутри списка или нет. Как вы знаете, для этого вы можете использовать оператор 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 ...), [default value])

Поиск местоположения элемента

Для списков также существует метод 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)

Ответ 3

Хотя ответ от Niklas B. довольно всеобъемлющий, когда мы хотим найти элемент в списке, иногда полезно получить его индекс:

next((i for i, x in enumerate(lst) if [condition on x]), [default value])

Ответ 4

Поиск первого случая

Там рецепт для этого в itertools:

def first_true(iterable, default=False, pred=None):
    """Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item
    for which pred(item) is true.

    """
    # first_true([a,b,c], x) --> a or b or c or x
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
    return next(filter(pred, iterable), default)

Например, следующий код находит первое нечетное число в списке:

>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3  

Ответ 5

Другой вариант: вы можете проверить, есть ли элемент в списке, if item in list: но это порядок O (n). Если вы имеете дело с большими списками элементов, и все, что вам нужно знать, это то, является ли что-то членом вашего списка, вы можете сначала преобразовать список в набор и воспользоваться преимуществами поиска набора с постоянным временем:

my_set = set(my_list)
if item in my_set:  # much faster on average than using a list
    # do something

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

Обратите внимание, что создание набора с помощью set(my_list) также является O (n), поэтому, если вам нужно сделать это только один раз, то сделать это не быстрее. Если вам необходимо повторно проверять членство, тогда это будет O (1) для каждого поиска после создания этого начального набора.

Ответ 6

list = [10, 20, 30, 40, 50]
n = int(input("\nEnter a Number to search from the list : "))

if n in list :
    print("\nMatch found")  
else :
    print("\nMatch not found")

Ответ 7

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

Ответ 8

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

  1. если элемент списка равен элементу ("пример" находится в ['one', 'example', 'two']):

    if item in your_list: some_function_on_true()

    'ex' в ['one', 'ex', 'two'] => True

    'ex_1' в ['one', 'ex', 'two'] => False

  2. если элемент списка подобен элементу ('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) или прочитайте их, если необходимо.

Ответ 9

Вместо использования list.index(x) который возвращает индекс x, если он найден в списке, или возвращает сообщение #ValueError если x не найден, вы можете использовать list.count(x) который возвращает количество вхождений x в списке (проверка того, что x действительно находится в списке) или возвращает 0 в противном случае (при отсутствии x). Самое интересное в count() - это то, что он не нарушает ваш код и не требует, чтобы вы выдавали исключение, когда x не найден

Ответ 10

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

метод count() возвращает количество элементов с указанным значением.

Синтаксис

list.count(value)

пример:

fruits = ['apple', 'banana', 'cherry']

x = fruits.count("cherry")

Пример вопроса:

item = someSortOfSelection()

if myList.count(item) >= 1 :

    doMySpecialFunction(item)

Ответ 11

Во многих из упомянутых способов, какой из них будет работать быстрее?

Ответ 12

Например, если вы хотите найти индекс всех элементов больше 30:

your_list = [11,22,23,44,55]
filter(lambda x:your_list[x]>30,range(len(your_list)))

#result: [3,4]