Cole
Cole

Reputation: 2509

sorting list of tuples by arbitrary key

order = ['w','x','a','z']
[(object,'a'),(object,'x'),(object,'z'),(object,'a'),(object,'w')]

How do I sort the above list of tuples by the second element according the the key list provided by 'order'?

UPDATE on 11/18/13:

I found a much better approach to a variation of this question where the keys are certain to be unique, detailed in this question: Python: using a dict to speed sorting of a list of tuples.

My above question doesn't quite apply because the give list of tuples has two tuples with the key value of 'a'.

Upvotes: 10

Views: 1488

Answers (1)

Julien Vivenot
Julien Vivenot

Reputation: 2250

You can use sorted, and give as the key a function that returns the index of the second value of each tuple in the order list.

>>> sorted(mylist,key=lambda x: order.index(x[1]))

[('object', 'w'), ('object', 'x'), ('object', 'a'), ('object', 'a'), ('object', 'z')]

Beware, this fails whenever a value from the tuples is not present within the order list.

Edit:

In order to be a little more secure, you could use :

sorted(mylist,key=lambda x: x[1] in order and order.index(x[1]) or len(order)+1)

This will put all entries with a key that is missing from order list at the end of the resulting list.

Upvotes: 13

Related Questions