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

Есть список, и мне нужно знать индекс определенного элемента.
Например:

wordToCheck = "Маша"
list = ['Маша', 'Саша', 'Маша', 'Петя', 'Ваня', 'Маша']

То есть в данном списке, мне нужны индексы — 0, 2, 5

Miron's user avatar

Miron

3,0172 золотых знака13 серебряных знаков32 бронзовых знака

3

Если нужны индексы именно элементов «Маша»:

s = ['Маша', 'Саша', 'Маша', 'Петя', 'Ваня', 'Маша']

x = [i for i, ltr in enumerate(s) if ltr == "Маша"]
print(x)   #  [0, 2, 5]

ответ дан 19 янв 2020 в 8:38

whizz169's user avatar

whizz169whizz169

1,5961 золотой знак4 серебряных знака14 бронзовых знаков

Здесь можно создать словарь, в котором по ключу будут храниться список с индексами

a = {}
index = 0

mlist = ['Маша', 'Саша', 'Маша', 'Петя', 'Ваня', 'Маша', 'Ваня', 'Саша']

for i in mlist:
    if i in a:
        a[i].append(index)
    else:
        a[i] = [index]

    index += 1

for i in a.keys():
    if len(a[i]) > 1:
        print(a[i])

ответ дан 19 янв 2020 в 6:06

Gari's user avatar

GariGari

4343 серебряных знака9 бронзовых знаков

6

mlist = ['Маша', 'Саша', 'Маша', 'Петя', 'Ваня', 'Маша', 'Ваня', 'Саша']
wordToCheck = "Маша"
a = {}
index = 0
count = 0

for i in mlist:
  if wordToCheck == i:
    a[index] = count
    index += 1
  count += 1
print(a)

Вывод:

{0: 0, 1: 2, 2: 5}

ответ дан 19 янв 2020 в 6:39

Miron's user avatar

MironMiron

3,0172 золотых знака13 серебряных знаков32 бронзовых знака

x:= [i for i, x in enumerate(lst) if lst.count(x) > 1]

aleksandr barakin's user avatar

ответ дан 20 авг 2022 в 21:21

Изотов Марк's user avatar

1

Здравствуй, сообщество. Я новичок, поэтому прошу сильно не пинать.
Допустим у нас есть целое число 5 и одномерный массив {1,2,4,5,2,5,7,5,2,8,1}.
Вопрос, как мне мне узнать индексы элементов массива, равных 5?

upd. Спасибо откликнувшимся, подумал и решил.

public static void main(String[] args) {
	
		int a = 5;
		int [] array = new int []{1,2,4,5,2,5,7,5,2,8,1};

		for(int i = 0; i < array.length; i++){
			if(array[i] == a){
				System.out.println(i);
			}
		}
	}

Решение задачи

Array.from(massiv.entries()).filter(i => i[1] == "ТВОЁ_ЗНАЧЕНИЕ_ЭЛЕМЕНТА").map(i => i[0])
// Альтернативный способ
Object.entries(massiv).filter(i => i[1] == "ТВОЁ_ЗНАЧЕНИЕ_ЭЛЕМЕНТА").map(i => Number(i[0]))
Object.entries(massiv).map(i => {if (i[1] == "ТВОЁ_ЗНАЧЕНИЕ_ЭЛЕМЕНТА"){return Number(i[0])}}).filter(i => i != undefined)
"ТВОЁ_ЗНАЧЕНИЕ_ЭЛЕМЕНТА" - в данном случае строка или число. Чтобы сравнивать объекты нужно другое условие.

Видео инструкция

В этом видео приводится пример получения индексов элементов массива JavaScript, с одинаковыми значениями. Ввод команд осуществляется в консоль браузера Google Chrome. Результат виден сразу.



Что у нас есть?

Есть массив:

var massiv = ["qw", "qe", "qr", "as", "ad", "af", "zx", "zc", "zv", "qaz", "as", "as"]

Мы хотим получить все индексы элементов из массива massiv, в которых встречается строковое значение «as». Строковое значение повторяется 3 раза. Нам нужно отловить все три положения и вернуть список индексов.

Массив из 12 элементов - JavaScript

Массив из 12 элементов — JavaScript

Простой способ — Через итератор массивов

На массиве вызываем метод объекта-прототипа entries():

massiv.entries()

Итератор массива - JavaScript

Итератор массива — JavaScript

В ответ нам прилетает прототип итератора массива.

Итератор массива — это объект, который представляет собой конкретную итерацию над некоторым конкретным объектом экземпляра массива. Для объектов Array Iterator не существует именованного конструктора. Вместо этого объекты итератора массива создаются путем вызова определенных методов объектов экземпляра массива.

Итератор массива имеет всего одно свойство — next().

Если сейчас мы передадим этот итератор массива в метод from() конструктора Array, то в ответ мы получим массив такой же длины, у которого элементами будут массивы с парами «ключ/значение». Причём ключ будет иметь числовой тип данных — это нам и нужно.

Array.from(massiv.entries())

Создание массива из итератора массива - JavaScript

Создание массива из итератора массива — JavaScript

Теперь нам нужно отфильтровать данный массив методом объекта-прототипа filter()

Array.from(massiv.entries()).filter(i => i[1] == "as")

Фильтруем массив из итератора - JavaScript

Фильтруем массив из итератора — JavaScript

Вытаскиваем ключи из вложенных массивов методом объектов-прототипов map()

Array.from(massiv.entries()).filter(i => i[1] == "as").map(i => i[0])

Извлечение индексов с одинаковыми элементами as - JavaScript

Извлечение индексов с одинаковыми элементами as — JavaScript

Задача решена. Список получен.

Способ №1 — через конструктор Object

Для начала создадим массив средствами конструктора Object, а именно свойством entries().

Object.entries(massiv)

Аргументом функции был наш массив. Эта команда вернёт нам новый массив, в котором элементами будут пары-массивы «ключ/значение» начального массива. Давайте смотреть. Проще один раз увидеть как это будет выглядеть.

Новый массив где элементы - это пары ключ-значение - JavaScript

Новый массив где элементы — это пары ключ-значение — JavaScript

Фильтруем этот массив на наличие строки «as»

Object.entries(massiv).filter(i => i[1] == "as")

Работа фильтра - JavaScript

Работа фильтра — JavaScript

Вытаскиваем значения первого элемента вложенного массива

Object.entries(massiv).filter(i => i[1] == "as").map(i => i[0])

Получение индексов в виде строк

Получение индексов в виде строк

Преобразовываем строки в числа

Object.entries(massiv).filter(i => i[1] == "as").map(i => Number(i[0]))

Преобразовываем строки в числа - JavaScript

Преобразовываем строки в числа — JavaScript

Мы получили нужные индексы одинаковых значений в массиве.

Альтернативный способ — «Замудрёный»

По этому массиву мы можем пробежаться свойством прототипов объекта Arraymap(). На каждой итерации мы будем возвращать первые элементы во из вложенных массивов только в том случае, если будет выполняться условие — второй элемент внутренних массивов должен быть равен искомому значению — «as».

Важный момент! Функция entries() возвращает нам строковые пары массивов. Чтобы не получать строку, в методе map мы будем сразу преобразовывать строковый тип данных в числовой и возвращать его. Будем пользоваться конструктором Number() и передавать в него значение первого элемента вложенного массива.

Object.entries(massiv).map(i => {if (i[1] == "as"){return Number(i[0])}})

Массив из map с undefined c Number - JavaScript

Массив из map с undefined c Number — JavaScript

Если без конструктора Number, то вернутся строки. Нам это не подходит.

Массив из map с undefined без Number - JavaScript

Массив из map с undefined без Number — JavaScript

Мы уже видим нужные нам индексы. Теперь нужно отфильтровать массив. Мы уберём все элементы со значениями undefined.

Object.entries(massiv).map(i => {if (i[1] == "as"){return Number(i[0])}}).filter(i => i != undefined)

Массив из трёх искомых индексов - JavaScript

Массив из трёх искомых индексов — JavaScript
[3, 10, 11]

Мы получили индексы элементов с одинаковыми значениями в первоначальном массиве. То есть под индексами 3, 10, 11 будут лежать одинаковые значения «as».

Проверяем:

massiv[3]
massiv[10]
massiv[11]

Все три индекса вернули одинаковое значение - JavaScript

Все три индекса вернули одинаковое значение — JavaScript

Всё отлично. Мы решили задачу.

Информационные ссылки

Стандарт ECMAScript — Object.entries ( O ) — https://tc39.es/ecma262/#sec-object.entries

Стандарт ECMAScript — Array.prototype.map ( callbackfn [ , thisArg ] ) — https://tc39.es/ecma262/#sec-array.prototype.map

Стандарт ECMAScript — Number ( value ) — https://tc39.es/ecma262/#sec-number-constructor-number-value

Стандарт ECMAScript — Array.prototype.filter ( callbackfn [ , thisArg ] ) — https://tc39.es/ecma262/#sec-array.prototype.filter

JavaScript | How do I get the indices of elements with the same values in an array?

Регулярное выражение для строкового метода replace()

Есть строка: let stroka = ‘Холодильник (Аристон) модель {Дед мороз отдыхает} артикул [23623789dnsdf]’ Как очистить эту строку от всех видов скобок? Всего […]

Ночные Работники Службы | navigator.serviceWorker

  partial interface Navigator { [SecureContext, SameObject] readonly attribute ServiceWorkerContainer serviceWorker; }; partial interface WorkerNavigator { [SecureContext, SameObject] readonly attribute ServiceWorkerContainer serviceWorker; […]

ECMAScript | Непустые диапазоны классов без тире (NonemptyClassRangesNoDash) | Регулярные выражения (Regular Expression)

  Производство NonemptyClassRangesNoDash :: ClassAtom оценивается следующим образом: 1. Верните набор символов CharSet, который является результатом оценки ClassAtom. Производство NonemptyClassRangesNoDash :: ClassAtomNoDash […]

ECMAScript | Операторы побитового сдвига (Bitwise Shift Operators)

Синтаксис оператора побитового сдвига ShiftExpression [Yield, Await] : AdditiveExpression [?Yield, ?Await] ShiftExpression [?Yield, ?Await] << AdditiveExpression [?Yield, ?Await] ShiftExpression [?Yield, ?Await] >> […]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // Узнать индексы одинаковых элементов в массиве
    var arList = new List<int>() { 1, 2, 4, 5, 2, 5, 7, 5, 2, 8, 1, 1, 1, 4 };
 
    // Ищем токо цифру 5
    List<int> indices = Enumerable.Range(0, arList.Count)
                        .Where(x => arList [x] == 5)
                        .ToList();
    indices.Dump();// Вывод на консоль
    
    // Здесь полная обработка
    var duplicates = arList 
          .Select((t,i) => new { Index = i, Text = t })
          .GroupBy(g => g.Text)
          .Where(g => g.Count() > 1);
    duplicates.Dump(); // Вывод на консоль в LINQPad 5. На консоль думаю сообразишь как вывести

I am trying to find the index of elements of my array using,

int[] arr = { 10, 20, 10 };
for ( int i; i,arr.length; i++)
{
int Tempval = arr[i];
index = Array.IndexOf(arr, Tempval);
console.writeline(index);
}

But its returning the same index for 10 i.e. 0 everytime.
How can I control it..??
Please help.

Regards

Jeyaram's user avatar

Jeyaram

9,0887 gold badges41 silver badges63 bronze badges

asked May 9, 2013 at 6:10

H.K's user avatar

5

Do it like this:

int[] arr = { 10, 20, 10 };
for ( int i=0; i<arr.length; i++)
{
int Tempval = arr[i];
index = Array.IndexOf(arr, Tempval);
console.writeline(index);
}

answered May 9, 2013 at 6:12

Jainendra's user avatar

JainendraJainendra

24.6k30 gold badges121 silver badges169 bronze badges

1

Using LINQ you can do:

int[] arr = { 10, 20, 10 };
var result =
              arr.Select((r, index) => new { Value = r, Index = index })
             .GroupBy(item => item.Value)
             .Where(grp => grp.Count() > 1)
             .Select(r => new { Indexes = r.Select(t => t.Index).ToArray() })
             .FirstOrDefault();

For output:

foreach (var value in result.Indexes)
    Console.WriteLine(value);

Output would be:

0
2

answered May 9, 2013 at 6:15

Habib's user avatar

HabibHabib

218k29 gold badges403 silver badges433 bronze badges

3

You are already using loop and i is your index, why find index again?

int[] arr = { 10, 20, 10 };
for ( int i=0; i<arr.length; i++)
{
 int Tempval = arr[i];
 index = Array.IndexOf(arr, Tempval);
 console.writeline(i);
}

If you want all the indexes,

        public IEnumerable<int> FindIndexes(int[] array, int value)
        {
            for (int i = 0; i < array.Length; i++)
            {
                int Tempval = array[i];
                if (Tempval == value)
                {
                    yield return i;
                }
            }
        }

and call FindIndexes(arr, 10);

answered May 9, 2013 at 6:12

hungryMind's user avatar

hungryMindhungryMind

6,9014 gold badges29 silver badges45 bronze badges

1

Понравилась статья? Поделить с друзьями:
  • Как найти половину окружности через радиус
  • Как найти маячок на своей машине
  • Альфа банк акции биржа как найти
  • Как найти середину треугольника если известны стороны
  • Как составить таблиц 7 класс