Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > [perl-python] sorting matrixes

Thread Tools

[perl-python] sorting matrixes

Xah Lee
Posts: n/a
Today we'll write a program that can sort a matrix in all possible

Here's the Perl documentation. I'll post a Perl and Python version in 2


sort_matrix( $matrix, [[$n1, $stringQ, $directionQ], [$n2, $stringQ,
$directionQ], ...]) sorts a matrix by $n1 th column then $n2 th...and
so on.

$matrix must be a reference to references of arrays, having the form
[[$e1, $e2,...], [...], ...]. $stringQ is a boolean indicating
whether to treat corresponding columns as a strings instead of as
number in the sorting process. True means string. $directionQ is a
boolean indicating ascending sort or not for the correpsonding
column. In the column spec $n1 $n2 ..., index counting starts at 0.


my $ref_matrix =
[3, 99, 'a'],
[2, 77, 'a'],
[1, 77, 'a']

sort_matrix( $ref_matrix, [ [2,1,1], [1,0,1] ]);
# this means sort by third column, regarding it as strings,
# and in ascending order. If tie, sort by second column,
# regarding it as number, in ascending order.

# returns [[2,77,'a'],[1,77,'a'],[3,99,'a']];


Note: in the above, ignore the "must be a reference to references of
arrays". That's technical point, because Perl the language do nested
lists thru workaround of "references".

Reply With Quote
Christos TZOTZIOY Georgiou
Posts: n/a
On 22 Mar 2005 09:02:51 -0800, rumours say that "Xah Lee" <(E-Mail Removed)> might
have written:

>Today we'll write a program that can sort a matrix in all possible
>Here's the Perl documentation. I'll post a Perl and Python version in 2

Don't bother writing a Python version... list.sort and its arguments are fine
and send their greetings.
TZOTZIOY, I speak England very best.
"Be strict when sending and tolerant when receiving." (from RFC195
I really should keep that in mind when talking with people, actually...
Reply With Quote
Xah Lee
Posts: n/a
Here's the solution to previous post.

perl code:

sub sort_matrix($$) {
my $ref_matrix = $_[0];
my @indexMatrix = @{$_[1]};

my @indexes = map {$_->[0]} @indexMatrix;
my @operators = map {$_->[1] ? ' cmp ' : ' <=> '} @indexMatrix;
my @directions = map {$_->[2]} @indexMatrix;

my $body_code = '';
my @body_array;
for (my $i = 0; $i <= $#indexes; $i++) {
if ($directions[$i]) {
push(@body_array, "(\$a->[$i]" . $operators[$i] .
} else {
push(@body_array, "(\$b->[$i]" . $operators[$i] .
$body_code = join( ' or ', @body_array);

my $array_code = '(map { [' . join(q(, ), map {"\$_->[$_]"}
@indexes) . ', $_]} @$ref_matrix)';

my $code = "map {\$_->[-1]} (sort { $body_code} $array_code)";
my @result = eval $code;
return [@result];

Python code

# python v 2.4

def sort_matrix(matrix, directives):
for dir in directives:
if dir[1]:
if dir[2]:
result.sort(lambda x,y: cmp( str(x[dir[0]]),
str(y[dir[0]])) )
result.sort(lambda x,y: cmp( str(x[dir[0]]),
str(y[dir[0]])), None, True)
if dir[2]:
result.sort(lambda x,y: cmp(float(x[dir[0]]),
float(y[dir[0]])) )
result.sort(lambda x,y: cmp(float(x[dir[0]]),
float(y[dir[0]])), None, True )
return result

m = [
[3, 99, 'a'],
[2, 77, 'a'],
[1, 77, 'a']

print sort_matrix(m,[

The Python code has not been tested much.

Xah Removed)

Reply With Quote

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
A question about Matrixes and Triangular matrixes KinGPIN C++ 1 07-24-2006 01:25 AM
i need to correlate between 2 dim' binary matrixes - Is there any library? C++ 2 05-22-2006 02:17 PM
Is it possible to create matrixes with vector <vector <double >> ? LumisROB C++ 14 09-27-2005 08:48 PM
[perl-python] sorting matrixes Xah Lee Perl Misc 2 03-28-2005 04:24 AM
MATRIXES - Dinamic Memory Jose Garcia C Programming 3 02-11-2005 03:21 AM