By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,345 Members | 1,758 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,345 IT Pros & Developers. It's quick & easy.

sort problem

P: n/a
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
Oct 20 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
How about:

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

Does that work?

Oct 20 '05 #2

P: n/a
Lasse Vågsæther Karlsen wrote:
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
Oct 20 '05 #3

P: n/a
Michele Petrazzo wrote:
Lasse Vågsæther Karlsen wrote:
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

Thanks,
Michele

Oct 20 '05 #4

P: n/a
Kent Johnson wrote:
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!

Kent


Thanks,
Michele
Oct 21 '05 #5

P: n/a
Michele Petrazzo <mi**************@TOGLIunipex.it> wrote:
Lasse Vågsæther Karlsen wrote:
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
Oct 22 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.