Получение индекса элемента двумерного массива python
Есть двумерный массив:
l = [[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
Нужно получить индекс 1. Если бы это был обычный массив, то индекс элемента находиться так: l.index(1). Но как получить индекс 1 в двумерном массиве.
Ответы (9 шт):
Могу предложить такой вариант:
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)
Как вариант:
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)
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]
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('Не нашел')
Все таки, если есть желание использовать 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 ('Не нашел')
Мне что то подсказывает, что тебе нужно будет вывести не только индекс, но и ряд, каком находится нужное число.
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
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