Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 21, 2011 01:06:44

evg90
От:
Зарегистрирован: 2011-11-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование списков

Всем доброй ночи.
Возникла такая проблемка: есть некий список (дерево) классов. В классах основным атрибутом является матрица 8*8, отвечающая за расстановку фигур на шахматной доске. Нужно расставить фигуры так, чтобы они не угрожали друг другу. Решаю пока что самым примитивным перебором всех вариантов.

class Board:
def __init__(self, board = None):
if not board:
self.board = [[0 for i in range(8)] for j in range(8)]
else:
self.board = copy.copy(board)

class PossibleBoard(Board):
def __init__(self, level, free_cells, parent, brd=None):
Board.__init__(self, board = brd)
self.level = level
self.free_cells = free_cells
self.parent = parent

class Work:
def __init__(self, figures):
self.figures = figures
self.board = PossibleBoard(0, 64, None)
self.result = [list() for i in range(len(self.figures)+1)]
self.result[0].append(self.board)

...

def set_queen(self, brd):
for x in range(8):
for y in range(8):
if not (brd.board)[x][y]:
tmp_board = PossibleBoard(self.level,
brd.free_cells-1,
copy.copy(brd),
copy.copy(brd.board))
(tmp_board.board)[x][y] = 'Q'
for i in range(8):
for j in range(8):
if (i==x or j==y or (abs(x-i)==abs(y-j)) ) and tmp_board.board[i][j]==0:
tmp_board.board[i][j] = 1
tmp_board.free_cells-=1

self.result[self.level].append(tmp_board)
И все бы хорошо, да только в итоге все экземпляры PossibleBoard указывают на один и тот же массив board, и изменяют его же. Что спрашивать в данном случае у google - не знаю, так что обращаюсь к Вам за помощью :)

P.S. готов также выслушать комментарии по оптимизации данных кусков кода.



Офлайн

#2 Ноя. 21, 2011 02:18:59

fanatid
От:
Зарегистрирован: 2011-09-21
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование списков

Для вложенных списков необходимо использовать deepcopy

>>> import copy
>>> a = [[],[],[]]
>>> b = copy.copy(a)
>>> c = copy.deepcopy(a)
>>> print id(a), [id(a[i]) for i in xrange(3)]
3073918252 [3073918124L, 3073918092L, 3073918284L]
>>> print id(b), [id(b[i]) for i in xrange(3)]
3073931276 [3073918124L, 3073918092L, 3073918284L]
>>> print id(c), [id(c[i]) for i in xrange(3)]
3073931180 [3073919372L, 3073931244L, 3073931340L]



Офлайн

#3 Ноя. 21, 2011 10:17:57

evg90
От:
Зарегистрирован: 2011-11-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование списков

Спасибо, помогло.



Офлайн

#4 Дек. 16, 2011 11:36:03

pyhappy
От: Moscow/Russia
Зарегистрирован: 2011-11-13
Сообщения: 22
Репутация: +  0  -
Профиль  

Копирование списков

Подскажите почему не работает deepcopy

import copy
rows=2 # число строк в исходной матрице (будет потом расчетное)
columns=3 # число столбцов в исходной матрице (будет потом расчетное)
z=None

matr_rev = [[z]*rows]*columns # готовим матрицу из элементов None
print(matr_rev)

matr_rev2= copy.deepcopy(matr_rev) #глубокая копия
matr_rev2[0][1]=2 #вставка 1 элемента
print(matr_rev2)
[, , ]
[, , ]

Отредактировано (Дек. 16, 2011 11:36:29)

Офлайн

#5 Дек. 16, 2011 12:12:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Копирование списков

pyhappy
Подскажите почему не работает deepcopy
она работает, просто первый список неправильно создаётся



Офлайн

#6 Дек. 16, 2011 12:53:48

pyhappy
От: Moscow/Russia
Зарегистрирован: 2011-11-13
Сообщения: 22
Репутация: +  0  -
Профиль  

Копирование списков

py.user.next
pyhappy
Подскажите почему не работает deepcopy
она работает, просто первый список неправильно создаётся
а подскажите как правильно создать пустую матрицу переменных размеров (те размеры являются вычисляемыми значениями)

Офлайн

#7 Дек. 16, 2011 15:05:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Копирование списков

>>> rows, cols = 2, 3
>>> matr = [[None for j in range(cols)] for i in range(rows)]
>>> matr[0]
[None, None, None]
>>> matr
[[None, None, None], [None, None, None]]
>>>



Офлайн

#8 Дек. 17, 2011 09:39:47

pyhappy
От: Moscow/Russia
Зарегистрирован: 2011-11-13
Сообщения: 22
Репутация: +  0  -
Профиль  

Копирование списков

py.user.next
>>> rows, cols = 2, 3
>>> matr = [[None for j in range(cols)] for i in range(rows)]
>>> matr[0]
[None, None, None]
>>> matr
[[None, None, None], [None, None, None]]
>>>
То что нужно. Спасибо!!

Офлайн

#9 Дек. 19, 2011 10:39:35

minotavr_x86
От:
Зарегистрирован: 2010-05-21
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование списков

rows, cols = 2, 3
a = map(list,[*cols]*rows)



Офлайн

#10 Дек. 20, 2011 06:43:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Копирование списков

>>> x, y, z = 2, 3, 4
>>> matr = [[[None for k in range(z)] for j in range(y)] for i in range(x)]
>>> matr[0][0][0] = 1
>>> matr
[[[1, None, None, None], [None, None, None, None], [None, None, None, None]], [[None, None, None, None], [None, None, None, None], [None, None, None, None]]]
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version