Python: поиск элемента в массиве [дубликат]
этот вопрос уже есть ответ здесь:
каков хороший способ найти индекс элемента в массиве в python?
Обратите внимание, что массив может быть отсортирован.
Есть ли способ указать, какой оператор сравнения использовать?
10 ответов:
лучший способ, вероятно, использовать метод списка .индекс.
для объектов в списке, вы можете сделать что-то вроде:
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
индексный метод списка сделает это за вас. Если вы хотите гарантировать заказ, сначала отсортируйте список с помощью
sorted(). Сортировка принимает cmp или ключевой параметр, чтобы диктовать, как будет происходить сортировка:a = [5, 4, 3] print sorted(a).index(5)или:
a = ['one', 'aardvark', 'a'] print sorted(a, key=len).index('a')
Я использую функцию для возврата индекса для соответствующего элемента (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")
Я нашел это, адаптировав некоторые туто. Спасибо 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]П. С. простите мой английский
как это?
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]
Comments