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



я наткнулся на это:



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


но иногда это не работает со всеми моими предметами, как будто они не отражаются в списке (список строк).



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

373   9  

9 ответов:

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

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

проверка, если что-то находится внутри

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

последний вернет a генератор что можно представить как своего рода "ленивый" список, который будет только построен, как только вы повторяете через него. Кстати, первый из них в точности эквивалентен

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]

если вы хотите найти один элемент или None использовать по умолчанию next, он не поднимет StopIteration если элемент не найден в списке:

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

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

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

поиск первого вхождения

есть рецепт для этого в 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  

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

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

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

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

    if item in your_list: some_function_on_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) или читать их при необходимости.

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")

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

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

#result: [3,4]

Comments

    Ничего не найдено.