Создать массив с индексами массива на основе значения

#python #arrays

#python #массивы

Вопрос:

У меня есть 2D-массив, подобный этому:

 map = [[0, 1, 1], [0, 2, 1], [0, 2, 2]]
  

Я хотел бы получить массив индексов на основе значений. Для example map[0][0] == 0 поэтому я хотел бы, чтобы пара (0, 0) была с индексом 0 в результирующем массиве. Результирующий массив должен выглядеть следующим образом:

 result[0] = [(0, 0), (1, 0), (2, 0)]
result[1] = [(0, 1), (0, 2), (1, 2)]
result[2] = [(1, 1), (2, 1), (2, 2)]
  

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

     val0 = []
    val1 = []
    val2 = []
    for i in range(3):
        for j in range(3):
            if(map[i][j] == 0) : val0.append((i, j))
            if(map[i][j] == 1) : val1.append((i, j))
            if(map[i][j] == 2) : val2.append((i, j))

    data = []
    data.append(val0)
    data.append(val1)
    data.append(val2)
  

Комментарии:

1. Почему бы вам не показать нам свой код, чтобы мы могли получить представление о том, где вы находитесь?

2. На вашем месте я бы сделал 2-х мерные циклы for, чтобы получить значение из вашего map и добавить их в result то место, где вы хотите. Но, как сказал @FChm, если вы хотите, чтобы мы вам помогли, вам нужно показать нам некоторый код.

3. После вашего редактирования: кажется, вы боретесь со своей фактической «позицией» в 2-х мерных циклах. Проверьте ответ Droid

Ответ №1:

Выполните итерацию по матрице и сохраните, где вы видите каждое значение в dict. Это ваш результат.

 retval = defaultdict(list)
for i in range(len(map)):
   for j in range(len(map[i])):
      val = map[i][j]
      retval[val].append((i,j))
print retval
  

Ответ №2:

Вы можете использовать некоторые numpy методы:

 import numpy as np
map = [[0, 1, 1], [0, 2, 1], [0, 2, 2]]
npmap = np.array(map)
[list(zip(*np.where(npmap==x))) for x in range(np.max(npmap) 1)]
#[[(0, 0), (1, 0), (2, 0)], [(0, 1), (0, 2), (1, 2)], [(1, 1), (2, 1), (2, 2)]]