Python: поиск элемента в списке
Что такое хороший способ найти индекс элемента в списке в Python?
Обратите внимание, что список не может быть отсортирован.
Есть ли способ указать, какой оператор сравнения использовать?
10 ответов
Наилучшим способом, вероятно, является использование метода списка.index.
Для объектов в списке вы можете сделать что-то вроде:
def __eq__(self, other):
return self.Value == other.Value
с любой специальной обработкой вам нужно.
Вы также можете использовать оператор for / in с enumerate (arr)
Пример поиска индекса элемента со значением> 100.
for index, item in enumerate(arr):
if item > 100:
return index, item
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.index("example")
5
Если вы просто хотите узнать, содержится ли элемент в списке или нет:
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> 'example' in li
True
>>> 'damn' in li
False
Вот еще один способ использования списка (некоторые люди могут посчитать это спорным). Это очень доступно для простых тестов, например, сравнения атрибутов объекта (которые мне очень нужны):
el = [x for x in mylist if x.attr == "foo"][0]
Конечно, это предполагает наличие (и, собственно, уникальность) подходящего элемента в списке.
Предполагая, что вы хотите найти значение в массиве NumPy, я думаю, что-то вроде этого может работать:
Numpy.where(arr=="value")[0]
Здесь index
метод, i = array.index(value)
, но я не думаю, что вы можете указать пользовательский оператор сравнения. Хотя для этого не составит труда написать собственную функцию:
def custom_index(array, compare_function):
for i, v in enumerate(array):
if compare_function(v):
return i
Я использую функцию для возврата индекса для соответствующего элемента (Python 2.6):
def index(l, f):
return next((i for i in xrange(len(l)) if f(l[i])), None)
Затем используйте его с помощью лямбда-функции для извлечения нужного элемента с помощью любого требуемого уравнения, например, с помощью имени элемента.
element = mylist[index(mylist, lambda item: item["name"] == "my name")]
Если мне нужно использовать его в нескольких местах в моем коде, я просто определяю конкретную функцию поиска, например, для поиска элемента по имени:
def find_name(l, name):
return l[index(l, lambda item: item["name"] == name)]
И тогда это довольно просто и читабельно:
element = find_name(mylist,"my name")
Индексный метод списка сделает это за вас. Если вы хотите гарантировать порядок, сначала отсортируйте список, используя sorted()
, Sorted принимает параметр cmp или key, чтобы определить порядок сортировки:
a = [5, 4, 3]
print sorted(a).index(5)
Или же:
a = ['one', 'aardvark', 'a']
print sorted(a, key=len).index('a')
Я нашел это, адаптировав некоторые туто. Спасибо Google, и всем вам;)
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 = [0,0,2,1]
ind = findall(a, lambda x:x>0))
[2, 3]
PS Разбери мой английский
Как этот?
def global_index(lst, test):
return ( pair[0] for pair in zip(range(len(lst)), lst) if test(pair[1]) )
Использование:
>>> global_index([1, 2, 3, 4, 5, 6], lambda x: x>3)
<generator object <genexpr> at ...>
>>> list(_)
[3, 4, 5]