На чтение 4 мин Просмотров 5к. Опубликовано 03.03.2023
Содержание
- Введение
- Поиск методом count
- Поиск при помощи цикла for
- Поиск с использованием оператора in
- В одну строку
- Поиск с помощью лямбда функции
- Поиск с помощью функции any()
- Заключение
Введение
В ходе статьи рассмотрим 5 способов поиска элемента в списке Python.
Поиск методом count
Метод count() возвращает вхождение указанного элемента в последовательность. Создадим список разных цветов, чтобы в нём производить поиск:
colors = ['black', 'yellow', 'grey', 'brown']
Зададим условие, что если в списке colors присутствует элемент ‘yellow’, то в консоль будет выведено сообщение, что элемент присутствует. Если же условие не сработало, то сработает else, и будет выведена надпись, что элемента отсутствует в списке:
colors = ['black', 'yellow', 'grey', 'brown']
if colors.count('yellow'):
print('Элемент присутствует в списке!')
else:
print('Элемент отсутствует в списке!')
# Вывод: Элемент присутствует в списке!
Поиск при помощи цикла for
Создадим цикл, в котором будем перебирать элементы из списка colors. Внутри цикла зададим условие, что если во время итерации color приняла значение ‘yellow’, то элемент присутствует:
colors = ['black', 'yellow', 'grey', 'brown']
for color in colors:
if color == 'yellow':
print('Элемент присутствует в списке!')
# Вывод: Элемент присутствует в списке!
Поиск с использованием оператора in
Оператор in предназначен для проверки наличия элемента в последовательности, и возвращает либо True, либо False.
Зададим условие, в котором если ‘yellow’ присутствует в списке, то выводится соответствующее сообщение:
colors = ['black', 'yellow', 'grey', 'brown']
if 'yellow' in colors:
print('Элемент присутствует в списке!')
else:
print('Элемент отсутствует в списке!')
# Вывод: Элемент присутствует в списке!
В одну строку
Также можно найти элемент в списке при помощи оператора in всего в одну строку:
colors = ['black', 'yellow', 'grey', 'brown']
print('Элемент присутствует в списке!') if 'yellow' in colors else print('Элемент отсутствует в списке!')
# Вывод: Элемент присутствует в списке!
Или можно ещё вот так:
colors = ['black', 'yellow', 'grey', 'brown']
if 'yellow' in colors: print('Элемент присутствует в списке!')
# Вывод: Элемент присутствует в списке!
Поиск с помощью лямбда функции
В переменную filtering будет сохранён итоговый результат. Обернём результат в список (list()), т.к. метода filter() возвращает объект filter. Отфильтруем все элементы списка, и оставим только искомый, если он конечно присутствует:
colors = ['black', 'yellow', 'grey', 'brown']
filtering = list(filter(lambda x: 'yellow' in x, colors))
Итак, если искомый элемент находился в списке, то он сохранился в переменную filtering. Создадим условие, что если переменная filtering не пустая, то выведем сообщение о присутствии элемента в списке. Иначе – отсутствии:
colors = ['black', 'yellow', 'grey', 'brown']
filtering = list(filter(lambda x: 'yellow' in x, colors))
if filtering:
print('Элемент присутствует в списке!')
else:
print('Элемент отсутствует в списке!')
# Вывод: Элемент присутствует в списке!
Поиск с помощью функции any()
Функция any принимает в качестве аргумента итерабельный объект, и возвращает True, если хотя бы один элемент равен True, иначе будет возвращено False.
Создадим условие, что если функция any() вернёт True, то элемент присутствует:
colors = ['black', 'yellow', 'grey', 'brown']
if any(color in 'yellow' for color in colors):
print('Элемент присутствует в списке!')
else:
print('Элемент отсутствует в списке!')
# Вывод: Элемент присутствует в списке!
Внутри функции any() при помощи цикла производится проверка присутствия элемента в списке.
Заключение
В ходе статьи мы с Вами разобрали целых 5 способов поиска элемента в списке Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂
Let’s assume I’m creating a simple class to work similar to a C-style struct, to just hold data elements. I’m trying to figure out how to search a list of objects for objects with an attribute equaling a certain value. Below is a trivial example to illustrate what I’m trying to do.
For instance:
class Data:
pass
myList = []
for i in range(20):
data = Data()
data.n = i
data.n_squared = i * i
myList.append(data)
How would I go about searching the myList list to determine if it contains an element with n == 5?
I’ve been Googling and searching the Python docs, and I think I might be able to do this with a list comprehension, but I’m not sure. I might add that I’m having to use Python 2.4.3 by the way, so any new gee-whiz 2.6 or 3.x features aren’t available to me.
DevPlayer
5,3431 gold badge25 silver badges20 bronze badges
asked Feb 28, 2009 at 18:06
1
You can get a list of all matching elements with a list comprehension:
[x for x in myList if x.n == 30] # list of all elements with .n==30
If you simply want to determine if the list contains any element that matches and do it (relatively) efficiently, you can do
def contains(list, filter):
for x in list:
if filter(x):
return True
return False
if contains(myList, lambda x: x.n == 3) # True if any element has .n==3
# do stuff
Ali Afshar
40.8k12 gold badges94 silver badges109 bronze badges
answered Feb 28, 2009 at 18:11
Adam RosenfieldAdam Rosenfield
388k96 gold badges512 silver badges586 bronze badges
3
Simple, Elegant, and Powerful:
A generator expression in conjuction with a builtin… (python 2.5+)
any(x for x in mylist if x.n == 10)
Uses the Python any()
builtin, which is defined as follows:
any(iterable)
->
Return True if any element of the iterable is true. Equivalent to:
def any(iterable):
for element in iterable:
if element:
return True
return False
h3xStream
6,2032 gold badges46 silver badges57 bronze badges
answered Feb 28, 2009 at 20:15
gahooagahooa
130k12 gold badges97 silver badges100 bronze badges
3
Just for completeness, let’s not forget the Simplest Thing That Could Possibly Work:
for i in list:
if i.n == 5:
# do something with it
print "YAY! Found one!"
answered Feb 28, 2009 at 18:20
Charlie MartinCharlie Martin
110k24 gold badges193 silver badges260 bronze badges
0
[x for x in myList if x.n == 30] # list of all matches
[x.n_squared for x in myList if x.n == 30] # property of matches
any(x.n == 30 for x in myList) # if there is any matches
[i for i,x in enumerate(myList) if x.n == 30] # indices of all matches
def first(iterable, default=None):
for item in iterable:
return item
return default
first(x for x in myList if x.n == 30) # the first match, if any
answered Feb 28, 2009 at 18:19
Markus JarderotMarkus Jarderot
86.3k21 gold badges136 silver badges138 bronze badges
2
filter(lambda x: x.n == 5, myList)
answered Feb 28, 2009 at 18:22
vartecvartec
130k36 gold badges217 silver badges244 bronze badges
3
You can use in
to look for an item in a collection, and a list comprehension to extract the field you are interested in. This (works for lists, sets, tuples, and anything that defines __contains__
or __getitem__
).
if 5 in [data.n for data in myList]:
print "Found it"
See also:
- Contains Method
- In operation
answered Feb 28, 2009 at 18:23
Tom DunhamTom Dunham
5,7392 gold badges30 silver badges27 bronze badges
Another way you could do it is using the next() function.
matched_obj = next(x for x in list if x.n == 10)
m0j0
3,4445 gold badges27 silver badges33 bronze badges
answered Jun 16, 2020 at 6:01
SEMICSSEMICS
1713 silver badges4 bronze badges
You should add a __eq__
and a __hash__
method to your Data
class, it could check if the __dict__
attributes are equal (same properties) and then if their values are equal, too.
If you did that, you can use
test = Data()
test.n = 5
found = test in myList
The in
keyword checks if test
is in myList
.
If you only want to a a n
property in Data
you could use:
class Data(object):
__slots__ = ['n']
def __init__(self, n):
self.n = n
def __eq__(self, other):
if not isinstance(other, Data):
return False
if self.n != other.n:
return False
return True
def __hash__(self):
return self.n
myList = [ Data(1), Data(2), Data(3) ]
Data(2) in myList #==> True
Data(5) in myList #==> False
answered Feb 28, 2009 at 18:10
Johannes WeissJohannes Weiss
52.2k16 gold badges102 silver badges136 bronze badges
Consider using a dictionary:
myDict = {}
for i in range(20):
myDict[i] = i * i
print(5 in myDict)
answered Mar 1, 2009 at 1:14
dan-gphdan-gph
16.2k12 gold badges61 silver badges79 bronze badges
2
Use the following list comprehension in combination with the index
method:
data_n = 30
j = [data.n for data in mylist].index(data_n)
print(mylist[j].data.n == data_n)
Tomerikoo
18.1k16 gold badges45 silver badges60 bronze badges
answered Apr 18, 2021 at 18:55
Время чтения 3 мин.
Существует несколько способов проверки наличия элемента в списке в Python:
- Использование метода index() для поиска индекса элемента в списке.
- Использование оператора in для проверки наличия элемента в списке.
- Использование метода count() для подсчета количества вхождений элемента.
- Использование функции any().
- Функция filter() создает новый список элементов на основе условий.
- Применение цикла for.
Содержание
- Способ 1: Использование метода index()
- Способ 2: Использование «оператора in»
- Способ 3: Использование функции count()
- Синтаксис
- Пример
- Способ 4: использование понимания списка с any()
- Способ 5: Использование метода filter()
- Способ 6: Использование цикла for
Способ 1: Использование метода index()
Чтобы найти элемент в списке Python, вы можете использовать метод list index(). Список index() — это встроенный метод, который ищет элемент в списке и возвращает его индекс.
Если один и тот же элемент присутствует более одного раза, метод возвращает индекс первого вхождения элемента.
Индекс в Python начинается с 0, а не с 1. Таким образом, через индекс мы можем найти позицию элемента в списке.
streaming = [‘netflix’, ‘hulu’, ‘disney+’, ‘appletv+’] index = streaming.index(‘disney+’) print(‘The index of disney+ is:’, index) |
Выход
The index of disney+ is: 2 |
Метод list.index() принимает единственный аргумент, элемент, и возвращает его позицию в списке.
Способ 2: Использование «оператора in»
Используйте оператор in, чтобы проверить, есть ли элемент в списке.
main_list = [11, 21, 19, 46] if 19 in main_list: print(“Element is in the list”) else: print(“Element is not in the list”) |
Выход
Вы можете видеть, что элемент «19» находится в списке. Вот почему оператор in возвращает True.
Если вы проверите элемент «50», то оператор in вернет False и выполнит оператор else.
Способ 3: Использование функции count()
Метод list.count() возвращает количество вхождений данного элемента в списке.
Синтаксис
Метод count() принимает единственный элемент аргумента: элемент, который будет подсчитан.
Пример
main_list = [11, 21, 19, 46] count = main_list.count(21) if count > 0: print(“Element is in the list”) else: print(“Element is not in the list”) |
Выход
Мы подсчитываем элемент «21», используя список в этой функции example.count(), и если он больше 0, это означает, что элемент существует; в противном случае это не так.
Способ 4: использование понимания списка с any()
Any() — это встроенная функция Python, которая возвращает True, если какой-либо элемент в итерируемом объекте имеет значение True. В противном случае возвращается False.
main_list = [11, 21, 19, 46] output = any(item in main_list for item in main_list if item == 22) print(str(bool(output))) |
Выход
Вы можете видеть, что в списке нет «22». Таким образом, нахождение «22» в списке вернет False функцией any(). Если функция any() возвращает True, элемент в списке существует.
Способ 5: Использование метода filter()
Метод filter() перебирает элементы списка, применяя функцию к каждому из них.
Функция filter() возвращает итератор, который перебирает элементы, когда функция возвращает значение True.
main_list = [11, 21, 19, 46] filtered = filter(lambda element: element == 19, main_list) print(list(filtered)) |
Выход
В этом примере мы используем функцию filter(), которая принимает функцию и перечисляет ее в качестве аргумента.
Мы использовали лямбда-функцию, чтобы проверить, совпадает ли входной элемент с любым элементом из списка, и если это так, он вернет итератор. Чтобы преобразовать итератор в список в Python, используйте функцию list().
Мы использовали функцию list() для преобразования итератора, возвращаемого функцией filter(), в список.
Способ 6: Использование цикла for
Вы можете узнать, находится ли элемент в списке, используя цикл for в Python.
main_list = [11, 21, 19, 46] for i in main_list: if(i == 46): print(“Element Exists”) |
Выход
В этом примере мы прошли список элемент за элементом, используя цикл for, и если элемент списка совпадает с входным элементом, он напечатает «Element exists».
На чтение 4 мин Просмотров 78.8к. Опубликовано 17.03.2021
Сегодня я расскажу, как проверить, содержит ли список элемент с помощью разных операторов в Python.
Содержание
- Используя цикл for
- Используя оператор in
- Используя оператор not in
- С помощью лямбда функции
- Используя функцию any
- Используя метод count
- Заключение
Используя цикл for
В качестве примера, я буду использовать список строк, содержащих несколько животных:
animals = ['Dog', 'Cat', 'Bird', 'Fish']
Простой и рудиментарный метод проверки, содержит ли список элемент: наш метод проходит через элемент и проверяет, соответствует ли элемент, на котором мы находимся, тому, который мы ищем. Давайте для этого воспользуемся циклом for:
for animal in animals: if animal == 'Bird': print('Chirp!')
Вывод программы:
Используя оператор in
Теперь более лаконичным подходом было бы использование встроенного оператора in, но с оператором if вместо оператора for. В паре с if он возвращает True, если элемент существует в последовательности или нет. Синтаксис оператора in выглядит следующим образом:
Используя этот оператор, мы можем сократить наш предыдущий код в один оператор:
if 'Bird' in animals: print('Chirp')
Вывод программы:
Этот подход имеет ту же эффективность, что и цикл for, поскольку оператор in, используемый таким образом, вызывает функцию list.__contains__, которая по своей сути циклически проходит через список — хотя это гораздо читабельнее.
Используя оператор not in
Вы можете использовать оператор not in, который является логической противоположностью оператору in. Он возвращает True, если элемент не присутствует в последовательности.
Давайте перепишем предыдущий пример кода, чтобы использовать оператор not in:
if 'Bird' not in animals: print('Chirp')
Запуск этого кода ничего не даст, так как Bird присутствует в нашем списке.
Но если мы попробуем это с Wolf:
if 'Wolf' not in animals: print('Howl')
Вывод программы:
С помощью лямбда функции
Еще один способ проверить, присутствует ли элемент — отфильтровать все, кроме этого элемента, точно так же, как просеять песок и проверить, остались ли в конце какие-нибудь раковины. Встроенный метод filter() принимает в качестве аргументов лямбда-функцию и список. Здесь мы можем использовать лямбда-функцию для проверки нашей строки «Bird» в списке animals.
Затем мы оборачиваем результаты в list(), так как метод filter() возвращает объект filter, а не результаты. Если мы упакуем объект filter в список, он будет содержать элементы, оставшиеся после фильтрации:
retrieved_elements = list(filter(lambda x: 'Bird' in x, animals)) print(retrieved_elements)
Вывод программы:
Сейчас этот подход не самый эффективный. Это довольно медленнее, чем предыдущие три подхода, которые мы использовали. Сам метод filter() эквивалентен функции генератора:
(item for item in iterable if function(item))
Замедление производительности этого кода, помимо всего прочего, происходит из-за того, что мы преобразуем результаты в список в конце концов, а также выполняем функцию для элемента на каждой итерации.
Используя функцию any
Еще один отличный встроенный подход заключается в использовании функции any, которая является просто вспомогательной функцией, которая проверяет, есть ли какие-либо (по крайней мере 1) экземпляры элемента в списке. Он возвращает True или False в зависимости от наличия или отсутствия элемента:
if any(element in 'Bird' for element in animals): print('Chirp')
Поскольку это приводит к True, наш оператор print сработает:
Этот подход также является эффективным способом проверки наличия элемента. Он ничем не уступает первым трём проверкам!
Используя метод count
Наконец, мы можем использовать функцию count, чтобы проверить, присутствует ли элемент или нет:
Эта функция возвращает вхождение данного элемента в последовательность. Если он больше 0, мы можем быть уверены, что данный элемент находится в списке.
Давайте проверим результаты функции count:
if animals.count('Bird') > 0: print("Chirp")
Функция count по своей сути зацикливает список, чтобы проверить количество вхождений, и этот код приводит к запуску print:
Заключение
В этой статье я рассмотрел несколько способов, как проверить, присутствует ли элемент в списке или нет. Я использовал цикл for, операторы in и not in, а также методы filter, any и count.
What is a good way to find the index of an element in a list in Python?
Note that the list may not be sorted.
Is there a way to specify what comparison operator to use?
asked Mar 3, 2009 at 1:45
2
From Dive Into Python:
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.index("example")
5
stivlo
83.2k31 gold badges142 silver badges199 bronze badges
answered Mar 3, 2009 at 1:52
3
If you just want to find out if an element is contained in the list or not:
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> 'example' in li
True
>>> 'damn' in li
False
answered Feb 17, 2011 at 10:00
EduardoEduardo
1,7811 gold badge11 silver badges5 bronze badges
0
The best way is probably to use the list method .index.
For the objects in the list, you can do something like:
def __eq__(self, other):
return self.Value == other.Value
with any special processing you need.
You can also use a for/in statement with enumerate(arr)
Example of finding the index of an item that has value > 100.
for index, item in enumerate(arr):
if item > 100:
return index, item
Source
tedder42
23.2k12 gold badges86 silver badges99 bronze badges
answered Mar 3, 2009 at 1:51
Brian R. BondyBrian R. Bondy
337k124 gold badges592 silver badges635 bronze badges
Here is another way using list comprehension (some people might find it debatable). It is very approachable for simple tests, e.g. comparisons on object attributes (which I need a lot):
el = [x for x in mylist if x.attr == "foo"][0]
Of course this assumes the existence (and, actually, uniqueness) of a suitable element in the list.
answered Sep 24, 2010 at 9:35
ThomasHThomasH
22.1k13 gold badges60 silver badges61 bronze badges
3
assuming you want to find a value in a numpy array,
I guess something like this might work:
Numpy.where(arr=="value")[0]
Jorgesys
124k23 gold badges328 silver badges264 bronze badges
answered Jan 27, 2011 at 15:03
2
There is the index
method, i = array.index(value)
, but I don’t think you can specify a custom comparison operator. It wouldn’t be hard to write your own function to do so, though:
def custom_index(array, compare_function):
for i, v in enumerate(array):
if compare_function(v):
return i
answered Mar 3, 2009 at 1:50
David ZDavid Z
127k27 gold badges252 silver badges277 bronze badges
I use function for returning index for the matching element (Python 2.6):
def index(l, f):
return next((i for i in xrange(len(l)) if f(l[i])), None)
Then use it via lambda function for retrieving needed element by any required equation e.g. by using element name.
element = mylist[index(mylist, lambda item: item["name"] == "my name")]
If i need to use it in several places in my code i just define specific find function e.g. for finding element by name:
def find_name(l, name):
return l[index(l, lambda item: item["name"] == name)]
And then it is quite easy and readable:
element = find_name(mylist,"my name")
answered Oct 20, 2011 at 12:30
jkijki
4,6171 gold badge34 silver badges29 bronze badges
0
The index method of a list will do this for you. If you want to guarantee order, sort the list first using sorted()
. Sorted accepts a cmp or key parameter to dictate how the sorting will happen:
a = [5, 4, 3]
print sorted(a).index(5)
Or:
a = ['one', 'aardvark', 'a']
print sorted(a, key=len).index('a')
answered Mar 3, 2009 at 1:52
Jarret HardieJarret Hardie
94.4k10 gold badges132 silver badges126 bronze badges
how’s this one?
def global_index(lst, test):
return ( pair[0] for pair in zip(range(len(lst)), lst) if test(pair[1]) )
Usage:
>>> global_index([1, 2, 3, 4, 5, 6], lambda x: x>3)
<generator object <genexpr> at ...>
>>> list(_)
[3, 4, 5]
answered Mar 3, 2009 at 2:06
2
I found this by adapting some tutos. Thanks to google, and to all of you 😉
def findall(L, test):
i=0
indices = []
while(True):
try:
# next value in list passing the test
nextvalue = filter(test, L[i:])[0]
# add index of this value in the index list,
# by searching the value in L[i:]
indices.append(L.index(nextvalue, i))
# iterate i, that is the next index from where to search
i=indices[-1]+1
#when there is no further "good value", filter returns [],
# hence there is an out of range exeption
except IndexError:
return indices
A very simple use:
a = [0,0,2,1]
ind = findall(a, lambda x:x>0))
[2, 3]
P.S. scuse my english
answered Oct 16, 2011 at 11:41