[Tutor] Pythonic nested lists
col speed
ajarncolin at gmail.com
Mon Oct 4 08:26:43 CEST 2010
Message: 6
Date: Tue, 28 Sep 2010 13:15:26 +0700
From: col speed <ajarncolin at gmail.com>
To: tutor at python.org
Subject: [Tutor] Pythonic nested lists
Message-ID:
<AANLkTimdykbKzxAacbAAGpQ_fAZ50Ruy=bcr81dQXk0P at mail.gmail.com>
Content-Type: text/plain; charset="iso-8859-1"
Hi all,
I've been trying to write a programme that solves sudoku problems for a
while now. I'm getting close, but would like to ask a few questions about
the most pythonic way of doing some things.
I've decided to create nested lists (row order, column order and square
order) which correspond with dictionary keys - the values of which are the
numbers given in the puzzle - so I can loop through the dict in different
orders.
I think the first two are OK, but the square order list seems extremely
messy and I would love some pointers. What I have is as follows:
roworder = [[str(j)+str(i) for i in range(9)] for j in range(9)]
colorder = zip(*roworder)
#here comes the problem!
start, index = 0,0
sqorder = []
for i in range(9):
sqorder.append([])
for j in range(start, start+3):
sqorder[i].extend(roworder[j][index:index+3])
if index == 6:
index = 0
else:
index += 3
if i == 2 or i == 5:
start += 3
Any comments at all would be gratefully received.
Thanks in advance
Colin
_______________________________________________________________________
HI again, I realise that I should have included more information in the
above e-mail. Here goes:
a/ I have a 9*9 nested list called "rows", which contains the given numbers
in a sudoku puzzle - with "0"s where the blanks go.
b/ I create roworder (roworder = [[str(j)+str(i) for i in range(9)] for j in
range(9)]) - [["00" --> "08"], ["10" --> "18"] --> ["80" --> "88"]]
c/ I populate a dictionary ("dic") with keys from "roworder" and values from
"rows"
d/ I loop through the dict, changing any value"0" to be set(range(1, 10))- a
list of "possible numbers".
e/ Then I do:
for i in roworder:
notPoss = set([dic[j] for j in i if type(dic[j]) == int])
for k in j:
if type(dic[k]) == set:
dic[k].difference_update(notPoss)
thus removing the numbers that exist in the row from the "possible numbers"
I need to do this for the columns and squares aswell, which is why I do:
colorder = zip(*roworder) - (create a nested list "column wise" rather than
"row wise")
and want to create a "square order" list - which is what the above mess
does.
I hope this clarifies things.
Thanks again
Colin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20101004/b3f5079c/attachment-0001.html>
More information about the Tutor
mailing list