sort problem

M

Michele Petrazzo

I have a list of lists (a grid table) that can have about 15000 - 20000
"rows" and 10 "cols", so:

1 [ [ 'aaa', 'vv', 'cc', 23, ... ],
2 [ 'aav', 'vv', 'cc', 45, ... ],
....
15000 [ 'sad', 'ad', 'es', 123, ... ], ]

I need to sort this list, but I need to specify two things: the "column"
and its type (string or int), so for example in this list, I want to
sort the fourth column that has int values. The type because that I want
that 1, 2, 12 will be sort in this order, not 1, 12, 2 like strings.

I have already tried to modify some code found on aspn, but the results
are always too slow for me, about 30-40 sec.
Can someone has some code or some point where can I start for speedup my
code?

Thanks,
Michele
 
?

=?iso-8859-1?q?Lasse_V=E5gs=E6ther_Karlsen?=

How about:

list.sort(key=lambda x: x[3])

Does that work?
 
M

Michele Petrazzo

Lasse said:
How about:

list.sort(key=lambda x: x[3])

Does that work?

Yes, on my linux-test-box it work, but I my developer pc I don't have
the 2.4 yet. I think that this is a good reason for update :)

Thanks,
Michele
 
K

Kent Johnson

Michele said:
Lasse said:
How about:

list.sort(key=lambda x: x[3])

Better to use key=operator.itemgetter(3)
Yes, on my linux-test-box it work, but I my developer pc I don't have
the 2.4 yet. I think that this is a good reason for update :)

or learn about decorate-sort-undecorate:

lst = [ ...whatever ]
lst = [ x[3], i, x for i, x in enumerate(lst) ]
lst.sort()
lst = [ x for _, _, x in lst ]

Kent
 
M

Michele Petrazzo

Kent said:
or learn about decorate-sort-undecorate:

lst = [ ...whatever ] lst = [ x[3], i, x for i, x in enumerate(lst) ]
I think that here the code must be changed (for the future):
lst = [ (x[3], i, x) for i, x in enumerate(lst) ]
lst.sort() lst = [ x for _, _, x in lst ]


Wow, this work with my py 2.3!

Thanks,
Michele
 
A

Alex Martelli

Michele Petrazzo said:
Lasse said:
How about:

list.sort(key=lambda x: x[3])

Does that work?

Yes, on my linux-test-box it work, but I my developer pc I don't have
the 2.4 yet. I think that this is a good reason for update :)

Updating is a good idea, and will let you get even faster by avoiding
the lambda:

import operator

thelist.sort(key=operator.itemgetter(3))

However, until you can upgrade you might be happy enough with a direct
implementation of the decorate-sort-undecorate (DSU) idiom which they
new "key=" named argument to sort implements. To wit:

aux = [ (x[3], x) for x in thelist ]
aux.sort()
thelist[:] = [ x[-1] for x in aux ]

Note that the "decoration" can include as many "columns" as you want,
transformations obtained by calling int(...) or str(...) on some of the
columns, and so on. This applies to "key=" in 2.4 just as well as to
the (slightly slower) direct implementation in 2.3 and earlier.


Alex
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,269
Messages
2,571,348
Members
48,027
Latest member
Selena87T

Latest Threads

Top