Python: поиск элемента в массиве

Что такое хороший способ найти индекс элемента в массиве в python? Обратите внимание, что массив не может быть отсортирован. Есть ли способ указать, какой оператор сравнения использовать?

Ответ 1

Лучшим способом, вероятно, является использование метода list.index.

Для объектов в списке вы можете сделать что-то вроде:

def __eq__(self, other):
    return self.Value == other.Value

с любой специальной обработкой, в которой вы нуждаетесь.

Вы также можете использовать оператор for/in с перечислением (arr)

Пример поиска индекса элемента, имеющего значение > 100.

for index, item in enumerate(arr):
    if item > 100:
        return index, item

Источник

Ответ 2

От Погружение в Python:

>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.index("example")
5

Ответ 3

Если вы просто хотите узнать, содержится ли элемент в списке или нет:

>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> 'example' in li
True
>>> 'damn' in li
False

Ответ 4

Вот еще один способ использования списка (некоторые могут найти его спорным). Он очень подходит для простых тестов, например. сравнение атрибутов объектов (что мне нужно много):

el = [x for x in mylist if x.attr == "foo"][0]

Конечно, это предполагает существование (и, фактически, единственность) подходящего элемента в списке.

Ответ 5

Предполагая, что вы хотите найти значение в массиве numpy, Я думаю, что-то вроде этого может работать:

Numpy.where(arr=="value")[0]

Ответ 6

Существует метод index, i = array.index(value), но я не думаю, что вы можете указать пользовательский оператор сравнения. Нетрудно написать свою собственную функцию, чтобы сделать это:

def custom_index(array, compare_function):
    for i, v in enumerate(array):
        if compare_function(v):
            return i

Ответ 7

Индексный метод списка сделает это за вас. Если вы хотите гарантировать заказ, сначала соберите список, используя sorted(). Сортировка принимает параметр cmp или key, чтобы определить, как будет выполняться сортировка:

a = [5, 4, 3]
print sorted(a).index(5)

Или:

a = ['one', 'aardvark', 'a']
print sorted(a, key=len).index('a')

Ответ 8

Я использую функцию для возврата индекса для соответствующего элемента (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")

Ответ 9

Я нашел это, адаптировав некоторые туто. Спасибо 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]

P.S. scuse мой английский

Ответ 10

как этот?

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]