Python: замена элемента в списке списков - PullRequest
1 голос
/ 20 января 2010

Вот мой код:

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

element = 4
x = 0
y = 0

   data[x][y] = element

Я хочу заменить элемент в координатах 0,0, но когда я печатаю данные, он не изменил элемент.


******* РЕДАКТИРОВАТЬ ******: ОК, ТАК ЗДЕСЬ МОЙ ПОЛНЫЙ КОД: **

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

z = []

#row 6
x1 = 6
for y in range(9):
  print data[x1][y]
  z.append(data[x1][y])


#column 8
y1 = 8 
for x in range(9):
  print data[x][y1]
  z.append(data[x][y1])


#finds the block coordinates
x = 6
y = 8
basex = x - x%3
basey = y - y%3
for x1 in range(basex,basex+3):
    for y1 in range(basey,basey+3):
        print x1,y1, data[x1][y1]
        z.append(data[x1][y1])

item = [1,2,3,4,5,6,7,8,9]
for element in item:
    if element not in z:
            print element

data[x][y] = element 
print data[x][y]

Ответы [ 8 ]

1 голос
/ 21 января 2010

Вам нужно бросить взгляд, как только вы найдете нужный элемент:

item = [1,2,3,4,5,6,7,8,9]
for element in item:
    if element not in z:
            print element
            break

data[x][y] = element 
print data[x][y]
1 голос
/ 20 января 2010

Единственное, что я вижу неправильно в вашем коде, это то, что самая последняя строка находится на другом уровне отступа.Поместив его на тот же уровень остальной части кода работает нормально.:)

Вам также может быть интересен модуль pprint:

>>> from pprint import pprint
>>> pprint(data)
[[4, 3, 0, 0, 7, 0, 0, 0, 0],
 [6, 0, 0, 1, 9, 5, 0, 0, 0],
 [0, 9, 8, 0, 0, 0, 0, 6, 0],
 [8, 0, 0, 0, 6, 0, 0, 0, 3],
 [4, 0, 0, 8, 0, 3, 0, 0, 1],
 [7, 0, 0, 0, 2, 0, 0, 0, 6],
 [0, 6, 0, 0, 0, 0, 2, 8, 0],
 [0, 0, 0, 4, 1, 9, 0, 0, 5],
 [0, 0, 0, 0, 8, 0, 0, 7, 9]]

Немного проще для чтения!

1 голос
/ 20 января 2010

Какую версию Python вы используете? Можете ли вы попробовать это из командной строки и опубликовать результаты, как показано ниже? Кажется, это работает для меня. Я в основном скопировал и вставил прямо из вашего поста.

Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> data = [
... [5,3,0,0,7,0,0,0,0],
... [6,0,0,1,9,5,0,0,0],
... [0,9,8,0,0,0,0,6,0],
... [8,0,0,0,6,0,0,0,3],
... [4,0,0,8,0,3,0,0,1],
... [7,0,0,0,2,0,0,0,6],
... [0,6,0,0,0,0,2,8,0],
... [0,0,0,4,1,9,0,0,5],
... [0,0,0,0,8,0,0,7,9]
... ]
>>> 
>>> element = 4
>>> x = 0
>>> y = 0
>>> 
>>> data
[[5, 3, 0, 0, 7, 0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0, 0, 0], [0, 9, 8, 0, 0, 0, 0, 6, 0], [8, 0, 0, 0, 6, 0, 0, 0, 3], [4, 0, 0, 8, 0, 3, 0, 0, 1], [7, 0, 0, 0, 2, 0, 0, 0, 6], [0, 6, 0, 0, 0, 0, 2, 8, 0], [0, 0, 0, 4, 1, 9, 0, 0, 5], [0, 0, 0, 0, 8, 0, 0, 7, 9]]
>>> data[x][y] = element
>>> data
[[4, 3, 0, 0, 7, 0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0, 0, 0], [0, 9, 8, 0, 0, 0, 0, 6, 0], [8, 0, 0, 0, 6, 0, 0, 0, 3], [4, 0, 0, 8, 0, 3, 0, 0, 1], [7, 0, 0, 0, 2, 0, 0, 0, 6], [0, 6, 0, 0, 0, 0, 2, 8, 0], [0, 0, 0, 4, 1, 9, 0, 0, 5], [0, 0, 0, 0, 8, 0, 0, 7, 9]]
>>> 
1 голос
/ 20 января 2010

Похоже, вы выложили последнюю строку, что дает мне ошибку в интерпретаторе Python. Если я уберу эту вкладку, она будет работать.

Ваш массив data изменился. Может быть, вы не распечатываете его, поэтому не знаете, что оно изменилось?

1 голос
/ 20 января 2010

У меня просто отлично работает ...

>>> data = [
... [5,3,0,0,7,0,0,0,0],
... [6,0,0,1,9,5,0,0,0],
... [0,9,8,0,0,0,0,6,0],
... [8,0,0,0,6,0,0,0,3],
... [4,0,0,8,0,3,0,0,1],
... [7,0,0,0,2,0,0,0,6],
... [0,6,0,0,0,0,2,8,0],
... [0,0,0,4,1,9,0,0,5],
... [0,0,0,0,8,0,0,7,9]
... ]
>>> element = 4
>>> x = 0
>>> y = 0
>>> print data[0][0]
5
>>> data[x][y] = element
>>> print data[0][0]
4
>>> 
0 голосов
/ 20 января 2010

for циклы в Python не создают новую область видимости; имя, которое вы используете для хранения текущего значения в цикле, сохранится после завершения цикла и сохранит последнее значение, которое оно имело во время работы цикла.

0 голосов
/ 20 января 2010

Это все еще работает с отредактированным кодом. Я изменил последние несколько строк вашего кода на это:

print "before =", data[x][y]
print "element =", element
data[x][y] = element 
print "after =", data[x][y]

И те напечатали это:

before = 0
element = 9
after = 9

Как уже упоминалось, последним значением элемента из цикла for будет значение его значения после завершения цикла for. Вот почему вы получаете 9 здесь.

0 голосов
/ 20 января 2010

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

Причина, по которой он работает не так, как вы ожидали, заключается в том, что «элемент» не существует вне контекста цикла. Вам нужно будет сохранить значение, которое вы хотите использовать, в переменной, которая существует в правильной области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...