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