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) для каждого поиска после создания этого начального набора.
проверьте, что в элементах списка строк нет дополнительного/нежелательного белого пространства. Это причина, которая может мешать объяснять, что предметы не могут быть найдены.
вы можете использовать один из двух возможных поисков при работе со списком строк:
если элемент списка равной к элементу ('пример' находится в ['one', 'example','two']):
'' в ['один','бывшие','два'] => истинного
if item in your_list: some_function_on_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)или читать их при необходимости.
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