2016-02-15 4 views
0

У меня есть список, содержащий n одинаковых матриц 3x3, где n - количество нулей в одной такой матрице.Заменить индекс в списке

В моей первой матрице, я хочу, чтобы заменить первую 0 с целым 2. Во второй матрице, я хочу, чтобы заменить второй 0 с 2. Это продолжается до тех пор, п: й матрицей, где я хочу заменить n: th 0 на 2. Т.е. каждая матрица должна иметь только один индекс.

Мой код до сих пор:

def replaceZero(x): 

    # Omitted code where I count number of 0 in x 
    n = 9 # in this example 

    # Creating a list which holds n matrices 
    lists = [] 
    for i in range(0,n): 
     lists.append(x) 

    # Replacing the i:th 0 with 2 
    for i in range(0,n): 
     m = -1 
     for j in range(0,3): 
      for k in range(0,3): 
       if lists[i][j][k] == 0: 
        m = m + 1 
        if m == i: 
         lists[i][j][k] = 2 

    return lists 

# Example of a matrix 
x = [[0,0,0],[0,0,0],[0,0,0]] 

Я не могу понять, почему он не работает. Хотя, слишком много нулей заменены, и замена одинакова для каждой матрицы.

Я стараюсь увеличивать m с 1 до тех пор, пока не будет найден нуль. Только тогда, когда m имеет то же значение, что и индекс текущей матрицы, должна произойти замена.

+0

Просьба представить подробную информацию о том, как "она не работает": то, что вы ожидали , и что вы получили вместо этого. (Показывать, как вы называете свою функцию, тоже будет хорошей идеей.) –

+0

гарантировано, что у вас есть n нулей? – SirParselot

+0

Нет, в конечном итоге аргумент не будет иметь нулей. – Mongzyy

ответ

1

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

Вместо этого, изменить с этой техникой:

import copy 
... 
    lists.append(copy.deepcopy(x)) 

Полная документация here. Поскольку у вас многоуровневая структура, вам необходимо использовать deepcopy; если вы используете только копия, вы получите девять матриц, которые указывают на то же самое три вектора нулей.

Вы путешествуете?


Рад помочь. Кроме того, можно упростить внутренние циклы:

for i in range(0,n): 
    j = i/3 
    k = i % 3 
    lists[i][j][k] = 2 
+0

Это трюк. Очень признателен – Mongzyy

1

Все, что вам нужно сделать, это добавить матрицу, используя копию по значению а не по ссылке. Это может быть сделано с помощью copy.deepcopy как:

import copy 

и заменить:

lists.append(x) 

с

lists.append(copy.deepcopy(x)) 
Смежные вопросы