Все таки, если есть желание использовать enumerate
, то вот так:
l = [[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
# функция одного прохода, до первого совпадения
# если совпадения не случилось, возвращает None
def find_index_2D(l:list, value:int) -> dict:
for row, sublist in enumerate(l):
if (bool(set(sublist) & {value})):
return {"row":row, "column":sublist.index(value)}
Но если заглянуть в документацию по enumerate, то можно увидеть, что реализация и эквивалент достаточно просты:
# эквивалент
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
то есть можно определить свое n
без enumerate
и увеличивать с каждым шагом for
. То есть, вот так писать тоже нет ничего зазорного:
def find_index_2D(l:list, value:int) -> dict:
n = 0
for sublist in l:
if (bool(set(sublist) & {value})):
return {"row":n, "column":sublist.index(value)}
n += 1
What I’m trying to do is print the largest number within a two dimensional array and it’s index location. I’m able to find the largest number, but I can’t seem to figure out how to print it’s index location. Anyway, here’s what I have so far:
public static void main(String[] args) {
int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};
double max = arr[0][0];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
}
}
}
System.out.println(max);
System.out.println(i + j); //No idea what I should be doing here, just trying out everything I can think of
asked Sep 23, 2011 at 22:43
Right now, you should consistently get 2 * arr.length as the final value. That isn’t what you are probably looking for. It looks like you want to know the coordinates for the max value. To do this, you’ll need to cache the values of the indexes and then use them later:
public static void main(String[] args) {
int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};
int tmpI = 0;
int tmpJ = 0;
double max = arr[0][0];
// there are some changes here. in addition to the caching
for (int i = 0; i < arr.length; i++) {
int[] inner = arr[i];
// caches inner variable so that it does not have to be looked up
// as often, and it also tests based on the inner loop's length in
// case the inner loop has a different length from the outer loop.
for (int j = 0; j < inner.length; j++) {
if (inner[j] > max) {
max = inner[j];
// store the coordinates of max
tmpI = i; tmpJ = j;
}
}
}
System.out.println(max);
// convert to string before outputting:
System.out.println("The (x,y) is: ("+tmpI+","+tmpJ+")");
answered Sep 23, 2011 at 22:48
cwallenpoolecwallenpoole
79.4k26 gold badges128 silver badges166 bronze badges
4
Be careful with your array dimensions! The second for-statement most of you have is wrong. It should go to up to arr[i].length:
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
tmpI = i; tmpJ = j;
}
}
}
answered Sep 23, 2011 at 22:53
Costis AivalisCostis Aivalis
13.7k3 gold badges46 silver badges47 bronze badges
Store i, j whenever you update max.
answered Sep 23, 2011 at 22:47
This would be if you wanted a single index into a flatten array:
public static void main (String[] args) throws java.lang.Exception
{
int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};
int[] flattened = new int[6*3]; // based off above
int maxIndex = 0;
double max = arr[0][0];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
flattened[i + j] = arr[i][j];
if (arr[i][j] > max) {
max = arr[i][j];
maxIndex = i+j;
}
}
}
System.out.println(max);
System.out.println(flattened [maxIndex]);
}
answered Sep 23, 2011 at 22:53
JoeJoe
80.3k18 gold badges127 silver badges145 bronze badges
int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};
int max = arr[0][0];
int maxI = 0, maxJ = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
maxI = i;
maxJ = j;
}
}
}
System.out.println(max);
System.out.println(maxI + "," + maxJ);
answered Sep 23, 2011 at 22:55
Bhesh GurungBhesh Gurung
50.3k22 gold badges93 silver badges141 bronze badges
You’ve got a two-dimensional array, therefore you need to know both indexes. Adding them together won’t do because you lose which-is-which. How about this:
System.out.println("[" + i + "][" + j + "]");
Joe
80.3k18 gold badges127 silver badges145 bronze badges
answered Sep 23, 2011 at 22:47
RichWRichW
1,9942 gold badges14 silver badges24 bronze badges
//C++ code
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> b;
vector<int> c;
int Func(int a[][10],int n)
{
int max;
max=a[0][0];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
b.push_back(i);
c.push_back(j);
}
}
}
b.push_back(0);
c.push_back(0);
return max;
}
void display(int a[][10],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j]<<"t";
}
cout<<endl;
}
}
int main()
{
int a[10][10],n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
cout<<endl;
display(a,n);
cout<<endl;
cout<<Func(a,n)<<" is the greatest "<<endl;
if(b.size()==1&&c.size()==1)
{
cout<<"Location is (1,1)"<<endl;
}
else
{
b.erase(b.end() - 1);
c.erase(c.end() - 1);
cout<<"Location is "<<"("<<b.back()+1<<","<<c.back()+1<<")"<<endl;
}
return 0;
}
answered Nov 7, 2012 at 19:26
2
You’re just adding the indices i and j together and then printing it to the screen. Since you’re running throug the entire loop it’s just going to be equal to 2*arr.length-2. What you need to do is store the values of i and j when you encounter a new max value.
For example:
int[][] arr = {{4, 44, 5, 7, 63, 1}, {7, 88, 31, 95, 9, 6}, {88, 99, 6, 5, 77, 4}};
int max = arr[0][0]; //dunno why you made it double when you're dealing with integers
int max_row=0;
int max_column=0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
max_row=i;
max_column=j;
}
}
System.out.println("The max is: "+max+" at index ["+max_row+"]["+max_column+"]");
answered Sep 9, 2013 at 5:22
Don’t sure that you implement effective algorithm, but why you just don’t save indices i,j in another variables when you set max.
This is very simple.
if (arr[i][j] > max) {
max = arr[i][j];
maxX = i;
maxY = j;
}
FYI If you want look at «insertion sorting» algorithms if you want better implementation.
answered Sep 23, 2011 at 22:53
abdolenceabdolence
2,3341 gold badge21 silver badges29 bronze badges
Я бы сказал что-то вроде этого:
public static Tuple<int, int> CoordinatesOf<T>(this T[,] matrix, T value)
{
int w = matrix.GetLength(0); // width
int h = matrix.GetLength(1); // height
for (int x = 0; x < w; ++x)
{
for (int y = 0; y < h; ++y)
{
if (matrix[x, y].Equals(value))
return Tuple.Create(x, y);
}
}
return Tuple.Create(-1, -1);
}
Dan Tao
16 июль 2010, в 00:27
Поделиться
Вот метод, который должен найти индекс в массиве с произвольным рангом.
… Добавлен диапазон верхних/нижних границ для ранга
public static class Tools
{
public static int[] FindIndex(this Array haystack, object needle)
{
if (haystack.Rank == 1)
return new[] { Array.IndexOf(haystack, needle) };
var found = haystack.OfType<object>()
.Select((v, i) => new { v, i })
.FirstOrDefault(s => s.v.Equals(needle));
if (found == null)
throw new Exception("needle not found in set");
var indexes = new int[haystack.Rank];
var last = found.i;
var lastLength = Enumerable.Range(0, haystack.Rank)
.Aggregate(1,
(a, v) => a * haystack.GetLength(v));
for (var rank =0; rank < haystack.Rank; rank++)
{
lastLength = lastLength / haystack.GetLength(rank);
var value = last / lastLength;
last -= value * lastLength;
var index = value + haystack.GetLowerBound(rank);
if (index > haystack.GetUpperBound(rank))
throw new IndexOutOfRangeException();
indexes[rank] = index;
}
return indexes;
}
}
Matthew Whited
16 июль 2010, в 01:22
Поделиться
Ещё вопросы
- 0Получить счет из двух разных таблиц на основе datetime в MySQL
- 0Слайдер изображений jquery не работает в ie8
- 1Укажите имя БД / схемы Oracle в tomcat context.xml
- 1документация sikuli 1.0.2 и ScreenRegion
- 0Каковы преимущества использования KnockoutJS по сравнению с AngularJS?
- 0Приложение Spring boot с контейнером mysql работает, но с контейнером приложения spring boot оно не работает
- 0выпадающая навигация в блокноте и перенос в dw cs6, она работает в режиме реального времени, а не в любом тестовом браузере, и мои страницы не связаны
- 0AngularJS / Javascript — Как я могу заменить весь объект на JSON
- 0Почему эта переменная работает в nav, а не в теге body?
- 0Не удается заставить TinyMCE 4.0.6 работать
- 1Фоновые задачи для регулярной синхронизации файлов
- 0Функция C ++, возвращающая строку с запятой
- 0Как решить конфликт с package_find из CMake?
- 1ASP.NET не может выполнить операцию над файлом, поскольку он используется другим процессом?
- 0Перемещение строки таблицы td данных вверх и вниз, за исключением первого td этой строки, для изменения порядка данных
- 0Необходимо преобразовать 16-битные данные в 8-битные
- 1Как ACCESS_BACKGROUND_LOCATION, представленный в Android Q, влияет на API Geofence?
- 0Как добавить текст с пробелами для метки с помощью jquery?
- 1Является ли View или ViewModel ответственным за преобразование данных из модели, представляемой в пользовательском интерфейсе?
- 1HashTable в Java собственного размера
- 1Сравните 2 списка с .intersection ()
- 1Как обновить форматирование в неисчисляемых полях и обновить вычисляемые поля в заполняемой форме PDF
- 1Фильтрация ботов и пауков для рекламной системы. Блокировка зашла слишком далеко
- 0fnfilter проблема поиска в datatables
- 0Найти функцию в тексте
- 1Python Pandas, чтение в файле и пропуск строк перед заголовком
- 1Android, как я могу выбрать изображение с камеры или галереи одновременно с одним намерением
- 1Наблюдаемый список Приведение / Конверсия
- 0JQuery флажок проблемы
- 0Как привязать сгенерированные d3 HTML-элементы к области видимости?
- 0Вставить несколько строк в laravel с полезной нагрузкой JSON
- 0Мой текст вращается, но фоновое изображение не
- 1Команды вибрации и уведомления не работают
- 0MySQL Insert Slow в AWS RDS
- 1Работа с Python2 и Python3 в одном проекте
- 0Необходимо найти МАКСИМАЛЬНОЕ значение между двумя датами аукциона
- 0Итерация по векторному столбцу C ++
- 1Ember простой поддельный сервис не отображается на странице
- 1Нажмите: как применить действие ко всем командам и подкомандам, но разрешить команде отказаться (часть duex)?
- 0Что означают числа с утверждениями равенства в предложении WHERE в SQL (WHERE 2> 1)?
- 1Разрешить двойному щелчку пользовательского файла и открывать мое приложение при загрузке его данных
- 0Как очистить текстовое поле onfocus, если оно содержит ноль, и onfocusout, если оно пустое, затем поставить ноль?
- 0Отображение man-страницы в C ++
- 1прокси nginx для клиента Javascript WebSocket
- 0Удаление объекта в AngularJS
- 0Отрицательные биты не работают как ожидалось PHP
- 1Запись в существующий XML-файл без замены его содержимого (XmlWriter)
- 0Как заполнить вид сетки данными из базы данных MySQL? (C # UWP)
- 1Калитка 6 Установите флажок CheckGroup по умолчанию не отмечен
- 0Должность: Абсолют; Div делает страницу слишком широкой и добавляет пустое пространство сбоку. Как мне уменьшить его размер?
using System; class Program { static void Main(string[] args) { int[,] a = { { 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1 } }; Console.WriteLine("Size = [{0}, {1}]", a.GetLength(0), a.GetLength(1)); } }
22.04.2010, 13:30 |
|||
|
|||
Как найти индекс по элементу в двумерном массиве? Еще вопрос, товарищи, как определить индекс по элементу в двумерном массиве. Например так: a = new Array() a[0] = new Array(1, 2) a[1] = new Array(2, 3) ... Теперь как мне найти индекс массива с элементом (2, 3). indexOf я так понимаю не поможет здесь? |
22.04.2010, 13:32 |
||||
|
||||
a[1][0] and a[1][1]
__________________ |
22.04.2010, 13:58 |
|||
|
|||
Это понятно. Дело в том что мне нужно найти пару a[1][0] a[1][1], сразу. |
22.04.2010, 14:27 |
||||
|
||||
так чтоле … for (var i = 0, len = a.length; a<len; i++){ a[i].indexOf('...'); } a[i] массив, делай дальше с ним, что хочешь
__________________ |
22.04.2010, 15:01 |
|||
|
|||
Наверное, ТС хочет сделать так: a.indexOf([2, 3]) Но такой вариант не будет работать, поэтому придется перебирать все массивы в цикле. |
22.04.2010, 15:26 |
|||
|
|||
Да, так мне и нужно было и так не работает. Но я думаю он имел ввиду так: a[i].indexOf(2) а i гонять по циклу я так и сделал в принципе, только без indexOf потому что отпадает в нем смысл. Я хотел избавиться именно от организации цикла. |