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

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

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

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

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

9 ответов


что касается вашего первого вопроса: этот код отлично подходит и должен работать, если 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]

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

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 ' В ['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) или прочитайте их если нужно.


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]