Как найти позицию элемента в массиве python
Перейти к содержимому

Как найти позицию элемента в массиве python

  • автор:

Как найти индекс значения в массиве NumPy (с примерами)

Вы можете использовать следующие методы, чтобы найти положение индекса определенных значений в массиве NumPy:

Метод 1: найти все ценные позиции в индексе

np.where (x== value ) 

Метод 2: найти первую позицию индекса значения

np.where (x== value )[0][0] 

Метод 3: найти первую позицию индекса нескольких значений

#define values of interest vals = np.array([ value1 , value2 , value3 ]) #find index location of first occurrence of each value of interest sorter = np.argsort (x) sorter[np.searchsorted (x, vals, sorter=sorter)] 

В следующих примерах показано, как использовать каждый метод на практике.

Метод 1: найти все ценные позиции в индексе

В следующем коде показано, как найти каждую позицию индекса, которая равна определенному значению в массиве NumPy:

import numpy as np #define array of values x = np.array([4, 7, 7, 7, 8, 8, 8]) #find all index positions where x is equal to 8 np.where (x== 8 ) (array([4, 5, 6]),) 

Из вывода мы видим, что позиции индекса 4, 5 и 6 равны значению 8 .

Метод 2: найти первую позицию индекса значения

В следующем коде показано, как найти первую позицию индекса, равную определенному значению в массиве NumPy:

import numpy as np #define array of values x = np.array([4, 7, 7, 7, 8, 8, 8]) #find first index position where x is equal to 8 np.where (x== 8 )[0][0] 4 

Из вывода мы видим, что значение 8 сначала встречается в позиции индекса 4.

Метод 3: найти первую позицию индекса нескольких значений

В следующем коде показано, как найти первую позицию индекса нескольких значений в массиве NumPy:

import numpy as np #define array of values x = np.array([4, 7, 7, 7, 8, 8, 8]) #define values of interest vals = np.array([4, 7, 8]) #find index location of first occurrence of each value of interest sorter = np.argsort (x) sorter[np.searchsorted (x, vals, sorter=sorter)] array([0, 1, 4]) 

Из вывода мы видим:

  • Значение 4 сначала встречается в индексной позиции 0.
  • Значение 7 сначала встречается в индексной позиции 1.
  • Значение 8 сначала встречается в индексной позиции 4.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в NumPy:

Зимняя школа в «Эврике»

Бинарный поиск в массиве (Python, два фиктивных элемента)

2. Бинарный поиск

Но если исходный массив уже отсортирован, то элемент в нем можно найти гораздо быстрее, если воспользоваться идеей двоичного (бинарного) поиска. Идея заключается в делении списка пополам, после чего в зависимости от значения медианного элемента в списке мы переходим либо к левой, либо к правой половине списка. Тем самым, длина части, в которой мы ищем элемент, сокращается в два раза на каждом шаге цикла, а, значит, общая сложность алгоритма двоичного поиска будет O(log2n). Итак, перед нами стоит задача — выяснить, содержится ли элемент key в некотором списке, или в его части. Мы будем сокращать часть списка, в которой мы ищем элемент key. А именно, введем две границы — left и right. При этом мы будем знать, что элемент A[right] строго больше, чем key, то же самое можно сказать и про элементы, которые правее right. Про элемент A[left] и те, которые находятся левее него мы будем знать, что все они меньше или равны key. А вот про элементы, которые лежат строго между A[left] и A[right] (то есть про элементы, чьи индексы больше left, но меньше right), мы ничего не знаем. В самом начале мы ничего не знаем про все элементы массива, поэтому присвоим left = -1 и right = len(A). Можно представить это так — к концам массива добавляются два фиктивных элемента, в левый конец добавляется элемент, в который записывается минус бесконечность (т. е. значение, заведомо меньшее, чем key), и этот элемент имеет индекс -1, а в правый элемент дописывается элемент, равный плюс бесконечности, и его индекс равен len(A). Соответственно, переменные left и right первоначально указывают на эти фиктивные элементы (то есть на самом деле никаких элементов к массиву добавлять не требуется, мы это делаем лишь мысленно). Затем разделим отрезок от left до right на две части и возьмем средний элемент между ними. Его индекс равен middle = (left + right) // 2. Сравним значение этого элемента со значением key. Если A[middle] строго больше чем key это означает, что сам элемент A[middle] и все, что правее него, должно попасть в правую часть. Это означает, что нужно сделать присваивание right = middle. Иначе (если A[middle] left + 1. Получаем следующий алгоритм: left = -1 right = len(A) while right > left + 1: middle = (left + right) // 2 if A[middle] > key: right = middle else: left = middle Что будет после завершения этого алгоритма? left и right указывают на два соседних элемента, при этом A[right] > key, A[left] = 0 and A[left] == key Что же можно сказать про значение right? Это минимальный элемент списка, который строго больше, чем key. Иными словами, на место элемента A[right] можно вставить элемент со значением key (сдвинув при этом всю правую часть списка на один элемент), сохраняя упорядоченность списка, при этом right есть самая правая позиция, куда можно вставить в список элемент key, сохраняя упорядоченность. В этом случае говорят, что значение right является «верхней границей» для элемента key: правее этой позиции нельзя вставить элемент key, сохраняя список упорядоченным. Вот функция, которая в заданном списке A находит «верхнюю границу» для заданного элемента key: def UpperBound(A, key): left = -1 right = len(A) while right > left + 1: middle = (left + right) // 2 if A[middle] > key: right = middle else: left = middle return right

Найти позицию элемента в массиве?

Вводится массив целых чисел. Найти позицию второго с конца элемента, который встречается в массиве наиболее часто. Если несколько значений встречаются в массиве одинаковое кол-во раз выбрать наибольший по абсолютному значению, затем просто по значению. Если такого элемента нет (все элементы массива разные), то вернуть -1.

  • Вопрос задан более трёх лет назад
  • 383 просмотра

2 комментария

Простой 2 комментария

Zarom

А где код? И на каком шаге возникло затруднение?
Сергей Горностаев @sergey-gornostaev Куратор тега Java
С чем помощь-то нужна? Надо код за вас написать?
Решения вопроса 0
Ответы на вопрос 2
Разработчик на С++, экс-олимпиадник.

1) Найдите элемент, который встречается наиболее часто. Для этого можно для каждого элемента в массиве подсчитать, сколько раз он встречается вложенным циклом, или лучше воспользоваться каким-нибудь хешмапом для хранения счетчиков. Или отсортировать копию массива и там подсчитать количества вхождений уже очень легко.

2) Найдите второй с конца элемент. Во-первых, если самый частый встречается всего 1 раз, то ответа нет (-1 по условию). Если он встречается 2 или более раза, то пройдитесь с конца массива и считайте, сколько раз встречали элементы, равные данному. Когда досчитаете до двух — вы нашли ответ.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

azerphoenix

Орхан Гасанлы @azerphoenix Куратор тега Java
Java Software Engineer

Так как это задача, то решать ее нужно вам самим, но могу подсказать примерные шаги для решения этой задачи:

Вводится массив целых чисел.

1) При помощи класса Scanner на вход получаем целые числа (int) и добавляем их в массив. Можно для удобства сперва добавлять их в List, а потом из List получить Array, так как массив при инициализации бывает фиксированного размера и придется тогда пересоздавать каждый раз массив. Легче при вводе числа из консоли добавлять их в список List , а затем уже из списка получить массив чисел.

Найти позицию второго с конца элемента, который встречается в массиве наиболее часто.

2) Для этого сперва нужно создать Map (Map)
Второй элемент из конца массива находится при помощи int numIndex = arr.length — 1 , а само число можно найти через int num = arr[numIndex]
Если это число имеется в массиве более 2-х раз, то с конца массива нужно посчитать встречаемость элементов равных данному элементу. Когда дойдете до 2-х это будет вашим ответом на задачу.

Если нужно найти наиболее часто встречающийся элемент, то можете попробовать создать Map key = число хранимое в массиве value (count) его количество (сколько раз он встречается в массиве).

Если несколько значений встречаются в массиве одинаковое кол-во раз выбрать наибольший по абсолютному значению,

3) Если value (count) из Map совпадает с другим value, то выбрать наиболшее значение key.
Т.е. допустим в Map у вас число 4 встречается 10 раз и число 5 встречается 11 раз, то выбираем число 5.

Если такого элемента нет (все элементы массива разные), то вернуть -1.

4) Если в массиве нет одинаковых чисел, то возвращаем -1

Находим индекс элемента списка в Python

Находим индекс элемента списка в Python

Статьи

Автор Admin На чтение 2 мин Просмотров 5.5к. Опубликовано 17.03.2023

Введение

Довольно часто бывает такая ситуация, что нужно определить индекс элемента в списке. В статье ответим на вопрос, как найти индекс элемента списка в Python.

Метод index()

Самый простой способ определения индекса элемента в списке — это использование метода index().

x = ['a', 'b', 'c', 'd', 'e'] print(x.index('c')) # Вывод: 2

Проблема только в том, что сама функция index() возвращает индекс первого вхождения заданного элемента в списке. Т.е. в списке может быть несколько элементов «a», метод index() выведет индекс первого из них.

x = ['a', 'b', 'c', 'a', 'e'] print(x.index('a')) # Вывод: 0

Вывод всех вхождений элемента в список

Для вывода всех вхождений элемента в список используем генератор списка с условием, где пройдёмся по всем элементам и их индексам при помощи функции enumerate(). В условии проверим совпадение итерабельного элемента с искомым:

x = ['a', 'b', 'c', 'a', 'e'] result = [i for i, x in enumerate(x) if x == 'a'] print(f"Элемент присутствует по индекс(у/ам) ") # Вывод: Элемент a присутствует по индекс(у/ам) [0, 3]

Заключение

В ходе статьи мы с Вами научились находить индекс элемента списка в языке программирования Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! ��

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *