Найти индексы значения в матрице 2d

У меня есть матрица формы,

mymatrix=[[1,2,3],[4,5,6],[7,8,9]] 

Я хочу получить индекс, скажем, например, 9, который находится на (2,2).

То, что я пытался сделать до сих пор.

 for i,j in enumerate(mymatrix): for k,l in enumerate(j): if l==9: print i,k 

Есть ли лучший способ сделать то же самое. Оптимизация, кто-нибудь? Заранее спасибо.

  • Есть ли способ поставить вывод Python Shell в окно tkinter?
  • Как управлять мышью на Mac с помощью Python?
  • Python Video Framework
  • pip freeze> требование.txt
  • __new__ и __init__ в Python
  • Как нарисовать пересекающиеся плоскости?
  • Flask-RESTful - возвращает пользовательский формат ответа
  • Почему этот скрипт Python работает на 4 раза медленнее на нескольких ядрах, чем на одном ядре
  • 4 Solutions collect form web for “Найти индексы значения в матрице 2d”

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

     [(index, row.index(val)) for index, row in enumerate(mymatrix) if val in row] 

    например:

     >>> mymatrix=[[1,2,9],[4,9,6],[7,8,9]] >>> val = 9 >>> [(index, row.index(val)) for index, row in enumerate(mymatrix) if val in row] [(0, 2), (1, 1), (2, 2)] 

    РЕДАКТИРОВАТЬ

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

    Я думаю, вы можете найти следующее полезное, просветительское и, возможно, даже удивительное:

    Изменить: перемещенное целевое значение до середины матрицы для имитации среднего местоположения, если данные являются случайными и выравнивают игровое поле для алгоритмов, которые останавливаются, как только они будут найдены.

    Также были проведены тайминги как для Python 2, так и для сравнения.

     from __future__ import print_function import sys import timeit setup = """ mymatrix=[[1,2,3],[4,9,6],[7,8,5]] # moved target value to middle val = 9 """ statements = { "Anuk (OP)": """ # finds all occurrences found = [] for i,j in enumerate(mymatrix): for k,l in enumerate(j): if l==val: found.append((i,k)) """, "Ryan Haining": """ # only finds first occurrence in each row found = [(index, row.index(val)) for index, row in enumerate(mymatrix) if val in row] """, "martineau": """ # finds all occurrences width = len(mymatrix[0]) found = [] posn = 0 for row in mymatrix: for col in row: if col == val: found.append((posn // width, posn % width)) posn += 1 """, "martineau #2": """ # finds all occurrences width = len(mymatrix[0]) found = [(posn // width, posn % width) for posn,elem in enumerate(col for row in mymatrix for col in row) if elem == val] """, "mtahmed": """ # stops after it finds first occurrence matrix_dim = len(mymatrix[0]) item_index = 0 for row in mymatrix: for i in row: if i == val: break item_index += 1 if i == val: break found = [(int(item_index / matrix_dim), item_index % matrix_dim)] """, } N = 1000000 R = 3 timings = [ (idea, min(timeit.repeat(statements[idea], setup=setup, repeat=R, number=N)), ) for idea in statements] longest = max(len(t[0]) for t in timings) # length of longest name print('fastest to slowest timings (Python {}.{}.{})\n'.format(*sys.version_info[:3]), ' ({:,d} executions, best of {:d})\n'.format(N, R)) ranked = sorted(timings, key=lambda t: t[1]) # sort by speed (fastest first) for timing in ranked: print("{:>{width}} : {:.6f} secs, rel speed {rel:>8.6f}x".format( timing[0], timing[1], rel=timing[1]/ranked[0][1], width=longest)) 

    Пример вывода:

     fastest to slowest timings (Python 2.7.5) (1,000,000 executions, best of 3) mtahmed : 2.850508 secs, rel speed 1.000000x martineau : 3.684153 secs, rel speed 1.292455x Ryan Haining : 8.391357 secs, rel speed 2.943811x Anuk (OP) : 14.014551 secs, rel speed 4.916510x martineau #2 : 15.880949 secs, rel speed 5.571270x fastest to slowest timings (Python 3.3.2) (1,000,000 executions, best of 3) mtahmed : 5.019435 secs, rel speed 1.000000x martineau : 5.217747 secs, rel speed 1.039509x Ryan Haining : 5.705710 secs, rel speed 1.136723x Anuk (OP) : 8.317911 secs, rel speed 1.657141x martineau #2 : 11.590270 secs, rel speed 2.309078x 

    Если вы конвертируете mymatrix в массив numpy, вы можете использовать numpy.where для возврата индексов:

     >>> import numpy as np >>> mymatrix=[[1,2,3],[4,5,6],[7,8,9]] >>> a = np.array(mymatrix) >>> a array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> b = np.where(a==9) >>> b (array([2]), array([2])) >>> mymatrix=[[1,2,3],[9,5,6],[7,8,9]] >>> a = np.array(mymatrix) >>> a array([[1, 2, 3], [9, 5, 6], [7, 8, 9]]) >>> b = np.where(a==9) >>> b (array([1, 2]), array([0, 2])) 

    Вы можете сделать это, а не использовать перечисление. НЕ уверен, что если это произойдет быстрее.

     matrix = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]] needle = 9 matrix_dim = len(matrix[0]) item_index = 0 for row in matrix: for i in row: if i == needle: break item_index += 1 if i == needle: break print(int(item_index / matrix_dim), item_index % matrix_dim) 

    Это займет ровно время i * dim(matrix) + (j+1) где результат выше ij который может быть O(n^2) в худшем случае.

    Python - лучший язык программирования в мире.