Есть список, и мне нужно знать индекс определенного элемента.
Например:
wordToCheck = "Маша"
list = ['Маша', 'Саша', 'Маша', 'Петя', 'Ваня', 'Маша']
То есть в данном списке, мне нужны индексы — 0, 2, 5
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
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
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
MironMiron
3,0172 золотых знака13 серебряных знаков32 бронзовых знака
x:= [i for i, x in enumerate(lst) if lst.count(x) > 1]
ответ дан 20 авг 2022 в 21:21
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 раза. Нам нужно отловить все три положения и вернуть список индексов.
Простой способ — Через итератор массивов
На массиве вызываем метод объекта-прототипа entries():
massiv.entries()
В ответ нам прилетает прототип итератора массива.
Итератор массива — это объект, который представляет собой конкретную итерацию над некоторым конкретным объектом экземпляра массива. Для объектов Array Iterator не существует именованного конструктора. Вместо этого объекты итератора массива создаются путем вызова определенных методов объектов экземпляра массива.
Итератор массива имеет всего одно свойство — next().
Если сейчас мы передадим этот итератор массива в метод from() конструктора Array, то в ответ мы получим массив такой же длины, у которого элементами будут массивы с парами «ключ/значение». Причём ключ будет иметь числовой тип данных — это нам и нужно.
Array.from(massiv.entries())
Теперь нам нужно отфильтровать данный массив методом объекта-прототипа filter()
Array.from(massiv.entries()).filter(i => i[1] == "as")
Вытаскиваем ключи из вложенных массивов методом объектов-прототипов map()
Array.from(massiv.entries()).filter(i => i[1] == "as").map(i => i[0])
Задача решена. Список получен.
Способ №1 — через конструктор Object
Для начала создадим массив средствами конструктора Object, а именно свойством entries().
Object.entries(massiv)
Аргументом функции был наш массив. Эта команда вернёт нам новый массив, в котором элементами будут пары-массивы «ключ/значение» начального массива. Давайте смотреть. Проще один раз увидеть как это будет выглядеть.
Фильтруем этот массив на наличие строки «as»
Object.entries(massiv).filter(i => i[1] == "as")
Вытаскиваем значения первого элемента вложенного массива
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]))
Мы получили нужные индексы одинаковых значений в массиве.
Альтернативный способ — «Замудрёный»
По этому массиву мы можем пробежаться свойством прототипов объекта Array — map(). На каждой итерации мы будем возвращать первые элементы во из вложенных массивов только в том случае, если будет выполняться условие — второй элемент внутренних массивов должен быть равен искомому значению — «as».
Важный момент! Функция entries() возвращает нам строковые пары массивов. Чтобы не получать строку, в методе map мы будем сразу преобразовывать строковый тип данных в числовой и возвращать его. Будем пользоваться конструктором Number() и передавать в него значение первого элемента вложенного массива.
Object.entries(massiv).map(i => {if (i[1] == "as"){return Number(i[0])}})
Если без конструктора Number, то вернутся строки. Нам это не подходит.
Мы уже видим нужные нам индексы. Теперь нужно отфильтровать массив. Мы уберём все элементы со значениями undefined.
Object.entries(massiv).map(i => {if (i[1] == "as"){return Number(i[0])}}).filter(i => i != undefined)
[3, 10, 11]
Мы получили индексы элементов с одинаковыми значениями в первоначальном массиве. То есть под индексами 3, 10, 11 будут лежать одинаковые значения «as».
Проверяем:
massiv[3]
massiv[10]
massiv[11]
Всё отлично. Мы решили задачу.
Информационные ссылки
Стандарт 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?
Есть строка: let stroka = ‘Холодильник (Аристон) модель {Дед мороз отдыхает} артикул [23623789dnsdf]’ Как очистить эту строку от всех видов скобок? Всего […]
partial interface Navigator { [SecureContext, SameObject] readonly attribute ServiceWorkerContainer serviceWorker; }; partial interface WorkerNavigator { [SecureContext, SameObject] readonly attribute ServiceWorkerContainer serviceWorker; […]
Производство NonemptyClassRangesNoDash :: ClassAtom оценивается следующим образом: 1. Верните набор символов CharSet, который является результатом оценки ClassAtom. Производство NonemptyClassRangesNoDash :: ClassAtomNoDash […]
Синтаксис оператора побитового сдвига 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
9,0887 gold badges41 silver badges63 bronze badges
asked May 9, 2013 at 6:10
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
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
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
hungryMindhungryMind
6,9014 gold badges29 silver badges45 bronze badges
1