Sorting a short list according to the order of a longer list

Suppose I have a reference list:

A = ['X_0', 'Z_0', 'X_1', 'Y_0', 'Z_1', 'X_2', 'Y_1', 'Z_2', 'Y_2']

as well as an (example) shorter list:

B = ['Z_0', 'X_1', 'X_0']

How can I sort B so that the order of the elements match the order provided in A? The final results should thus match the order of A like so:

B_final = ['X_0', 'Z_0', 'X_1']

>Solution :

You want the list B sorted by the index of the value in A, so;

sorted(B, key=A.index)

This will sort B by each values index in A.

If you are using a very long list, index is not very efficient since it searches the list for every value, so you may want to go for sorting by a dictionary instead.

First create a dictionary of the index values of the list;

>>> C = {val:ix for ix,val in enumerate(A)}

…then sort by the dictionary value, which is much more efficient than a linear search in the list;

>>> sorted(B, key=C.get)
['X_0', 'Z_0', 'X_1']

Leave a Reply