#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)]]