Sorting lists

A

asc

Hi all,
I have a problem and I'm not sure whether sort() can help me.
I understand that if I have a list; say L = ['b', 'c', 'a']
I can use L.sort() and I will then have; L = ['a', 'b', 'c']

But my problem is this. I have a list, that contains a number of
embeded lists;
e.g. L2 = [['something', 'bb'], ['somethingElse', 'cc'],
['anotherThing', 'aa']]
Now I want to sort this list by the second item of each sublist. So
the outcome I would like is;
L2 = [['anotherThing', 'aa'], ['something', 'bb'], ['somethingElse',
'cc']]

Is there a way I can use sort for this? Or am I going to have write a
custom function to sort this out?

Many thanks.
 
J

John Machin

But my problem is this. I have a list, that contains a number of
embeded lists;
e.g. L2 = [['something', 'bb'], ['somethingElse', 'cc'],
['anotherThing', 'aa']]
Now I want to sort this list by the second item of each sublist. So
the outcome I would like is;
L2 = [['anotherThing', 'aa'], ['something', 'bb'], ['somethingElse',
'cc']]

Is there a way I can use sort for this?

Yes. Read the manual. Look for the key argument. You need to make up a
function (using def or lambda) that will pluck the desired sort-key
out of a sub-list.
 
C

Chris Rebert

Hi all,
I have a problem and I'm not sure whether sort() can help me.
I understand that if I have a list; say L = ['b', 'c', 'a']
I can use L.sort() and I will then have; L = ['a', 'b', 'c']

But my problem is this. I have a list, that contains a number of
embeded lists;
e.g. L2 = [['something', 'bb'], ['somethingElse', 'cc'],
['anotherThing', 'aa']]
Now I want to sort this list by the second item of each sublist. So
the outcome I would like is;
L2 = [['anotherThing', 'aa'], ['something', 'bb'], ['somethingElse',
'cc']]

Is there a way I can use sort for this? Or am I going to have write a
custom function to sort this out?

You use the `key` argument to .sort():

L2.sort(key=lambda item: item[1])

This sorts L2 by the result of applying the `key` function to each of
the items. Behind the scenes, I believe it does a Schwartzian
transform.

Cheers,
Chris
 
B

bearophileHUGS

Chris Rebert:
You use the `key` argument to .sort():
L2.sort(key=lambda item: item[1])

I like the lambda because it's a very readable solution that doesn't
require the std lib and it doesn't force the programmer (and the
person that reads the code) to learn yet another thing/function.

But I can suggest to also look for operator.itemgetter.

------------
In C# a syntax for lambdas may become a little shorter, but the
parsing may become less easy:
L2.sort(key = sub => sub[1])

In Mathematica they use the & to define lambdas, and #1, #2, etc, to
denote the arguments.

Bye,
bearophile
 
T

Terry Reedy

Chris Rebert:
You use the `key` argument to .sort():
L2.sort(key=lambda item: item[1])

I like the lambda because it's a very readable solution that doesn't
require the std lib and it doesn't force the programmer (and the
person that reads the code) to learn yet another thing/function.

But I can suggest to also look for operator.itemgetter.

Since itemgetter is builtin, it will probably run faster, though the
O(nlogn) time for sorting will override the O(n) time for key calls.
 
S

Steven D'Aprano

Chris Rebert:
You use the `key` argument to .sort(): L2.sort(key=lambda item:
item[1])

I like the lambda because it's a very readable solution that doesn't
require the std lib and it doesn't force the programmer (and the person
that reads the code) to learn yet another thing/function.

But I can suggest to also look for operator.itemgetter.

Since itemgetter is builtin, it will probably run faster, though the
O(nlogn) time for sorting will override the O(n) time for key calls.

Well, eventually, for large enough lists, sure. But if the constants are
sufficiently different, the key calls may be the bottleneck. O(foo)
analysis is valuable, but it isn't the full story. A fast enough O(n**2)
algorithm might be preferable to a slow O(log n) algorithm for any data
you're interested in.

To give an extreme example, suppose your itemgetter function (not the
Python built-in!) had to query some remote database over the internet. It
might be O(n) but the multiplicative constant would be so large that the
time taken to get items far dominates the time to sort the list, unless
the list is *seriously* huge:

(Say) sorting takes O(n*log n) with multiplicative constant of 1e-5.
Item getting takes O(n) with multiplicative constant of 1.

Then the time taken to sort doesn't become larger than the time taken to
get the items until approximately:

1e-5*n*log(n) > n
1e-5*log(n) > 1
log(n) > 1e5
n > 2**100000

which is pretty big... for any reasonable-sized list, the O(n) part
dominates despite the asymptotic behaviour being O(n*log n).
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top