Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Not Equal to Each Other?

Reply
Thread Tools

Not Equal to Each Other?

 
 
ale.of.ginger@gmail.com
Guest
Posts: n/a
 
      11-04-2005
Another question: I am writing a sudoku solving program. The
'solving' part of is just multiple iterations. It will take random
numbers and keep switching it all around until a set of logic
statements has been met (ie; all numbers in a row are not equal to each
other) ... that's where my question comes in.

Cellboard = my list for storing each row/column's data.

Rather than writing

cellboard[0] is not* (cellboard[1] and cellboard[2] and cellboard[3]
and cellboard[4] ... cellboard[8])
cellboard[1] is not (cellboard[0] and cellboard[2] and cellboard[3] and
cellboard[4] ... cellboard[8])
etc...

* should this be != ?

the above so that all the data in one row is not equal to each other,
is there something I can write to make it simpler? For example,
(cellboard[0] is not cellboard[1] is not ... cellboard[8]) only worked
for the numbers to the left and right of the cell - is there anyway I
can expand this to cover all numbers in a set range?

 
Reply With Quote
 
 
 
 
Stephen Thorne
Guest
Posts: n/a
 
      11-04-2005
On 3 Nov 2005 17:01:08 -0800, http://www.velocityreviews.com/forums/(E-Mail Removed)
<(E-Mail Removed)> wrote:
> the above so that all the data in one row is not equal to each other,
> is there something I can write to make it simpler? For example,
> (cellboard[0] is not cellboard[1] is not ... cellboard[8]) only worked
> for the numbers to the left and right of the cell - is there anyway I
> can expand this to cover all numbers in a set range?


Python has an operator call 'in', which will allow you to do what you're after.

"1 in (1,2,3)" will be true
"4 in (1,2,3)" will be false
"not 1 in (1,2,3)" will be false

So you'd be after something along the lines of:
not cellboard[0] in (cellboard[1], ...., celboard[8]).

This seems quite tedious to write, maybe you should consider something
along the lines of using slicing:

not celboard[0] in cellboard[1:8]

I hope i have given you enough tools to do what you're trying to do.

--
Stephen Thorne
Development Engineer
 
Reply With Quote
 
 
 
 
Alex Martelli
Guest
Posts: n/a
 
      11-04-2005
<(E-Mail Removed)> wrote:
...
> Rather than writing
>
> cellboard[0] is not* (cellboard[1] and cellboard[2] and cellboard[3]
> and cellboard[4] ... cellboard[8])
> cellboard[1] is not (cellboard[0] and cellboard[2] and cellboard[3] and
> cellboard[4] ... cellboard[8])


Urgh... the fastest way to check that a list of N numbers has no
duplicates is:
if len(set(thelist)) == len(thelist):
print 'no duplicates'

But if your purpose is to generate N random samples out of a population
of M, look at function random.sample (in module random in the Pythons
standard library) and you'll do even better!-)


Alex
 
Reply With Quote
 
ale.of.ginger@gmail.com
Guest
Posts: n/a
 
      11-04-2005
For the

not cellboard[0] in cellboard[1:8] (I knew about ranges/slicing using a
colon, can't believe I didn't think of that!)

line, will I have to write that out for each number?

So the line:

not cellboard in ((cellboard[1:8]) and (cellboard[9] and cellboard[18]
and cellboard[27] and cellboard[36] and cellboard[45] and cellboard[54]
and cellboard[63] and cellboard[72]) and (cellboard[1:2] and
cellboard[9:11] and cellboard[18:20]))

will cover all the logic requirements for the number in cell 0 (well,
row 1, column 1).

But will I have to copy + paste + edit that for all 81 cells? That
isn't complicated, just tedious - thanks though.

 
Reply With Quote
 
Bengt Richter
Guest
Posts: n/a
 
      11-04-2005
On 3 Nov 2005 17:01:08 -0800, (E-Mail Removed) wrote:

>Another question: I am writing a sudoku solving program. The
>'solving' part of is just multiple iterations. It will take random
>numbers and keep switching it all around until a set of logic
>statements has been met (ie; all numbers in a row are not equal to each
>other) ... that's where my question comes in.
>
>Cellboard = my list for storing each row/column's data.
>
>Rather than writing
>
>cellboard[0] is not* (cellboard[1] and cellboard[2] and cellboard[3]
>and cellboard[4] ... cellboard[8])
>cellboard[1] is not (cellboard[0] and cellboard[2] and cellboard[3] and
>cellboard[4] ... cellboard[8])
>etc...
>
>* should this be != ?
>
>the above so that all the data in one row is not equal to each other,
>is there something I can write to make it simpler? For example,
>(cellboard[0] is not cellboard[1] is not ... cellboard[8]) only worked
>for the numbers to the left and right of the cell - is there anyway I
>can expand this to cover all numbers in a set range?
>


UIAM if you have a list of items that are comparable and hashable, like integers,
you can make a set of the list, and duplicates will be eliminated in the set.
Therefore if the resulting set has the same number of members as the list it
was made from, you can conclude that the list contains no duplicates. E.g.,

>>> cellboard = range(
>>> cellboard

[0, 1, 2, 3, 4, 5, 6, 7]
>>> set(cellboard)

set([0, 1, 2, 3, 4, 5, 6, 7])
>>> len(set(cellboard))

8
>>> cellboard[2] = 7
>>> cellboard

[0, 1, 7, 3, 4, 5, 6, 7]
>>> set(cellboard)

set([0, 1, 3, 4, 5, 6, 7])
>>> len(set(cellboard))

7

So the test would be
>>> len(set(cellboard))==len(cellboard)

False
And after repairing the list to uniqueness of elements:
>>> cellboard[2] = 2
>>> len(set(cellboard))==len(cellboard)

True

HTH

Regards,
Bengt Richter
 
Reply With Quote
 
ale.of.ginger@gmail.com
Guest
Posts: n/a
 
      11-04-2005
How do I 'define' set? Is there something to include (like import
random)?

while (choice == 3) and len(set(cellboard[0:8]))==len(cellboard[0:8]):
# DEFINE TWO RANDOM VARIABLES (ONE FOR ARRAY, ONE FOR NUMBER
VALUE)
solvingrandom = random.randint(1,9)
cellboardrandom = random.randint(0,
set(cellboard[0:8])

# CHECK TO MAKE SURE THE RANDOMLY ASSIGNED CELL DOES NOT HAVE A
VALUE
if (cellboard[cellboardrandom] is not ('1' or '2' or '3' or '4'
or '5' or '6' or '7' or '8' or '9')):
cellboard[cellboardrandom] = solvingrandom

The above is my code (right now it will only work for the first row's
numbers). Anything else I need to add?

 
Reply With Quote
 
Juho Schultz
Guest
Posts: n/a
 
      11-04-2005
(E-Mail Removed) wrote:
> How do I 'define' set? Is there something to include (like import
> random)?
>

set is a built-in type in Python 2.4
If you use 2.3 you can use the sets module with "import sets"


> while (choice == 3) and len(set(cellboard[0:8]))==len(cellboard[0:8]):
> # DEFINE TWO RANDOM VARIABLES (ONE FOR ARRAY, ONE FOR NUMBER
> VALUE)
> solvingrandom = random.randint(1,9)
> cellboardrandom = random.randint(0,
> set(cellboard[0:8])
>
> # CHECK TO MAKE SURE THE RANDOMLY ASSIGNED CELL DOES NOT HAVE A
> VALUE
> if (cellboard[cellboardrandom] is not ('1' or '2' or '3' or '4'
> or '5' or '6' or '7' or '8' or '9')):
> cellboard[cellboardrandom] = solvingrandom
>
> The above is my code (right now it will only work for the first row's
> numbers). Anything else I need to add?
>

Simplify your code a bit:

'2' is not ('1' or '2' or '3' or '4' or '5' or '6' or '7' or '8' or '9')
evaluates to True
'1' is not ('1' or '2' or '3' or '4' or '5' or '6' or '7' or '8' or '9')
evaluates to False
Somehow I do not believe you want that behavipur.

If cellboard contains characters, you could use:
if (cellboard[cellboardrandom] not in '123456789')

for integers, the following should work:
if not (1 <= cellboard[cellboardrandom] <= 9)

Using None to code empty cells, you could even have:
if (cellboard[cellboardrandom] is None)
 
Reply With Quote
 
jgardner@jonathangardner.net
Guest
Posts: n/a
 
      11-04-2005
> will I have to write that out for each number?

Not if you know how to use the 'for' statement. It will allow you to
iterate through the rows or columns or whatnot.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Transform a 2D color image into 2 images of (R1,G1,B) at each pixelof image 1 and (R2,G2,B) at each pixel of image2 for STEREO visualization 88888 Dihedral C++ 10 12-23-2011 02:28 PM
Internet Sharing: Equal upload speeds but un-equal download speeds =?Utf-8?B?TkpU?= Wireless Networking 3 09-15-2007 06:22 AM
Array#each - getting each element and the index Pat Maddox Ruby 6 01-20-2006 04:04 PM
how do i? Full scan of each control in each grid row cell John Blair ASP .Net 1 08-03-2005 11:02 AM
xsl:for-each for each 3 elements problem Tjerk Wolterink XML 3 11-03-2004 05:22 PM



Advertisments