Как найти индекс двумерного массива питон

Все таки, если есть желание использовать 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

akyo pipi



Ученик

(98),
закрыт



7 месяцев назад

[83, 5, -4, 39]
[91, 96, 44, 17]
[-6, 99, 62, 74]
[21, -10, 84, 27]
Допустим, есть такой массив. Нужно вывести все элементы массива больше числа 54 и их индексы. Если с элементами всё ещё понятно, то как вывести ещё и их индексы?
И как вообще выглядит индекс двумерного массива ([1,2] или просто условно 5)?
Всем заранее спасибо
Примечание к заданию: нельзя использовать стандартные функции такие как мин, макс,суммы и т.д. для нахождения искомых величин следует использовать циклы

Vitness

Просветленный

(32688)


7 месяцев назад

Если просто доставать элемент из массива двумерного, то так:
some_list[index1][index2]

Например для твоего списка – some_list[3][1] это -10

Как выводить – должно быть сказано в самом задании, никакого общего принципа нет.

Если с элементами всё ещё понятно, то как вывести ещё и их индексы?

Так же, как и элементы. Сохранять нужный индекс и выводить

Алексей Хвостовский

Мудрец

(18076)


7 месяцев назад

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

 mtx = [[83, 5, -4, 39] ,[91, 96, 44, 17], [-6, 99, 62, 74], [21, -10, 84, 27]]  
for row in mtx: print(*row)
for row in range(len(mtx)):
for col in range(len(mtx[row])):
if mtx[row][col] > 54:
print(f'{mtx[row][col]} ({row}, {col})')

Могу предложить такой вариант:

l = [[0, 0, 0, 0],
     [0, 0, 1, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]]

index = 0
index2 =0
for i in l:  
    try:
        index2 = i.index(1)
    except ValueError:
        index2 = -1
    if index2 != -1:
        break
    index += 1
print(index)
print(index2)

→ Ссылка

Автор решения: S. Nick

Как вариант:

l = [[0, 0, 0, 0],
     [0, 0, 1, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]]
 
ind = [ [i, _list.index(1)] for i,_list in enumerate(l) if 1 in l[i] ]

print(*ind)

→ Ссылка

Автор решения: Exe

import numpy as np

l = np.array([[0, 0, 0, 0],
              [0, 0, 1, 0],
              [0, 0, 0, 0],
              [0, 0, 0, 0]])

print(np.where(l==1))

Вывод:

(array([1], dtype=int64), array([2], dtype=int64))

array([1], dtype=int64) – индекс строки

array([2], dtype=int64)) – индекс столбца

print(l[np.where(l==1)])

[1]

→ Ссылка

Автор решения: vp_arth

l = [[0, 0, 0, 0],
     [0, 0, 1, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]]

index = [item for sublist in l for item in sublist].index(1)
row, col = index//4, index % 4
print(index, row, col) # 6 1 2

→ Ссылка

Автор решения: Алексей Белкин

def getInd(list_in_list, value):
    for index_list, valuelist in enumerate(list_in_list):
         if value == valuelist[2]:
             return index_list
    else:
        print('Не нашел')

→ Ссылка

Автор решения: Dmitry

Все таки, если есть желание использовать 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

→ Ссылка

Автор решения: Алексей Белкин

Ну я вопрос понял что 1 ищут именно в этой позиции. А если без разницы в какой позиции то тогда:

def getInd(list_in_list, value):
for index_list, valuelist in enumerate(list_in_list):
    for searchvalue in valuelist:
        if searchvalue == value:
            return index_list
else:
    return ('Не нашел')

→ Ссылка

Автор решения: moondust

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

l = [[0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 1, 0],
     [0, 0, 0, 0]]
row = 1
for f in l:
    for num in f:
        if num == 1:
            print('index:', (f.index(1)))
            print('row:', row)
            break
    row += 1

→ Ссылка

Автор решения: gintaras.martinaitis

import numpy as np

l = [[0, 0, 0, 0],
     [0, 0, 1, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]]
YX = np.where( l == 1 )
#(array([1], dtype=int32), array([2], dtype=int32))
Y = YX[ 0 ][0] #Y = 1
X = YX[ 1 ][0] #X = 2

    проверяем

print( l[ Y, X ] )
[1.]
print( l[ Y, X ][0] )
1.0

Дла двумерного массивв np.where( массив = число ) вернет кортеж ( Y, X ) поправил ответ добавил [0] чтобы получить число а не массив 1X1

→ Ссылка

[ тот самый код ]

def count_neighbours(grid, row, col): # [row] - ряд
									  # [col] - столбец
	mass_el_1 = []
	grid1 = np.array(grid)

	mass8 = [(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]

	mass3 = [(0,4),(4,4),(4,0),(0,0)]
	
	mass5 = [(1,0),(2,0),(3,0),(0,1),(0,2),(0,3),(1,4),(2,4),(3,4),(4,1),(4,2),(4,3)]
 
	xl = []
	yl = []
	for x in range(grid1.shape[0]):
		for y in range(grid1.shape[1]):
			if grid1[x, y] != 0:
				print (x, y)
				xl.append(x)
				yl.append(y)
				print(xl)
				print(yl)


	listindex = list(zip(xl,yl))
	print(listindex)

	xlll = []
	ylll = []

	neighbours = []
	exepts = []

	for x in range(grid1.shape[0]):
		for y in range(grid1.shape[1]):
			if grid1[x, y] != 0:
							
				for i in listindex:
					print('i: ',i)

					for i1 in mass8:
						print('i1: ',i1)

						if i == i1:
							
							try:
										
								if  grid1[x-1, y-1] == 1:
									neighbours.append((x-1, y-1))
								elif grid1[x, y-1] == 1:
									neighbours.append((x, y-1))
								elif grid1[x+1, y-1] == 1:
									neighbours.append((x+1, y-1))							
								elif grid1[x+1, y] == 1:
									neighbours.append((x+1, y))							
								elif grid1[x+1, y+1] == 1:
									neighbours.append((x+1, y+1))							
								elif grid1[x, y+1] == 1:
									neighbours.append((x, y+1))							
								elif grid1[x-1, y+1] == 1:
									neighbours.append((x-1, y+1))							
								elif grid1[x-1, y] == 1:
									neighbours.append((x-1, y))

							except IndexError :

								exepts.append((x,y))
							
	print(neighbours,"len:",len(neighbours))
	print(exepts,"len:",len(exepts))

count_neighbours(((1, 0, 0, 1, 0),
                  (0, 1, 0, 0, 0),
                  (0, 0, 1, 0, 1),
                  (1, 0, 0, 0, 0),
                  (0, 0, 1, 0, 0),),0,0)

Иногда нам приходится использовать таблицы с данными для решения своих задач. Такие таблицы называются матрицами или двумерными массивами.

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

mas = [['й', 'ц', 'у'], ['к','е','н'], ['г', 'ш', 'щ']] 
#Вывод всего двумерного массива 
print(mas) 
#Вывод первого элемента в первой строке 
print(mas[0][0]) # Выведет й 
#Вывод третьего элемента в третьей строке 
print(mas[2][2]) # Выведет щ 

Создание двумерных массивов

Создать такой массив в Python можно разными способами. Разберем первый:

# Создание таблицы с размером 3x3, заполненной нулями
a = 3           
mas = [0] * a 
for i in range(a): 
    mas[i] = [0] * a 
print(mas) # Выведет [[0, 0, 0], [0, 0, 0], [0, 0, 0]]     

Второй способ предполагает создание пустого списка с добавлением в него новых списков. Рассмотрим на примере:

# Создание таблицы с размером 2x2, заполненной единицами
a = 2
mas = [] 
for i in range(a): 
    mas.append([0] * a)
print(mas) # Выведет [[1, 1, 1], [1, 1, 1], [1, 1, 1]]                                 

Третьим и самым простым способом является генератор списков с x строками, которые будут состоять из y элементов. Пример: 

# Создание таблицы с размером 3x3, заполненной двойками
a = 3
mas = [[2] * a for i in range(a)]
print(mas) # Выведет [[2, 2, 2], [2, 2, 2], [2, 2, 2]]

Комьюнити теперь в Телеграм

Подпишитесь и будьте в курсе последних IT-новостей

Подписаться

Способы ввода двумерных массивов

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

a=int(input())
mas = [] 
for i in range(a): 
    mas.append(list(map(int, input().split())))
print(mas) 

Запускаем программу и сначала вводим количество строк в массиве (допустим, 3). Далее вводим строки в порядке их очереди. Например:

1 1 1
1 1 1
1 1 1

После этого данная программа выведет наш двумерный массив: [[1, 1, 1], [1, 1, 1], [1, 1, 1]].

То же самое можно сделать с помощью генератора двумерных массивов:

mas = [list(map(int, input().split())) for i in range(int(input()))]
# Вводим 
3
1 1 1
1 1 1
1 1 1
print(mas) # Выведет [[1, 1, 1], [1, 1, 1], [1, 1, 1]]

Вывод двумерных массивов

Для обработки и вывода списков используются два вложенных цикла. Первый цикл – по порядковому номеру строки, второй – по ее элементам. Например, вывести массив можно так:

mas = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
for i in range(0, len(mas)):
    for i2 in range(0, len(mas[i])):
        print(mas[i][i2], end=' ')
    print()
# Выведет
1 1 1
1 1 1
1 1 1

То же самое можно сделать не по индексам, а по значениям массива:

mas = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
for i in mas: 
    for i2 in i: 
        print(i2, end=' ') 
    print()
# Выведет
1 1 1
1 1 1
1 1 1

Способ с использованием метода join():

mas = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
for i in mas: 
    print(' '.join(list(map(str, i))))
# Выведет
1 1 1
1 1 1
1 1 1

Вывод одной из строк двумерного массива можно осуществить с помощью цикла и того же метода join(). Для примера выведем вторую строку в произвольном двумерном массиве:

mas = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
string = 2
for i in mas[string-1]:
    print(i, end=' ')
# Выведет 1 1 1

Для вывода определенного столбца в двумерном массиве можно использовать такую программу:

mas = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
column = 2
for i in mas:
    print(i[column-1], end=' ')
# Выведет 2 5 8

Обработка двумерных массивов

Составим произвольный двумерный массив с числами и размерностью 4×4:

2 4 7 3
4 5 6 9
1 0 4 2
7 8 4 7

Теперь поставим числа в каждой строке по порядку:

mas = [[2, 4, 7, 3], [4, 5, 6, 9], [1, 0, 4, 2], [7, 8, 4, 7]]
mas2 = []
for i in mas:
    mas2.append(sorted(i))
print(mas2)
# Выведет [[2, 3, 4, 7], [4, 5, 6, 9], [0, 1, 2, 4], [4, 7, 7, 8]]

А теперь расставим все числа по порядку, вне зависимости от их нахождения в определенной строке:

mas = [[2, 4, 7, 3], [4, 5, 6, 9], [1, 0, 4, 2], [7, 8, 4, 7]]
mas2 = []
for i in mas:
    for i2 in i:
        mas2.append(i2)
mas=sorted(mas2)
for x in range(0, len(mas), 4):
    e_c = mas[x : 4 + x]
    if len(e_c) < 4:
        e_c = e_c + [None for y in range(n - len(e_c))]
    print(list(e_c))
# Выведет
[0, 1, 2, 2]
[3, 4, 4, 4]
[4, 5, 6, 7]
[7, 7, 8, 9]

Итог

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

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