# python – Sorting list based on values from another list

## python – Sorting list based on values from another list

Shortest Code

``````[x for _, x in sorted(zip(Y, X))]
``````

Example:

``````X = [a, b, c, d, e, f, g, h, i]
Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]

Z = [x for _,x in sorted(zip(Y,X))]
print(Z)  # [a, d, h, b, c, e, i, f, g]
``````

Generally Speaking

``````[x for _, x in sorted(zip(Y, X), key=lambda pair: pair[0])]
``````

Explained:

1. `zip` the two `list`s.
2. create a new, sorted `list` based on the `zip` using `sorted()`.
3. using a list comprehension extract the first elements of each pair from the sorted, zipped `list`.

For more information on how to setuse the `key` parameter as well as the `sorted` function in general, take a look at this.

Zip the two lists together, sort it, then take the parts you want:

``````>>> yx = zip(Y, X)
>>> yx
[(0, a), (1, b), (1, c), (0, d), (1, e), (2, f), (2, g), (0, h), (1, i)]
>>> yx.sort()
>>> yx
[(0, a), (0, d), (0, h), (1, b), (1, c), (1, e), (1, i), (2, f), (2, g)]
>>> x_sorted = [x for y, x in yx]
>>> x_sorted
[a, d, h, b, c, e, i, f, g]
``````

Combine these together to get:

``````[x for y, x in sorted(zip(Y, X))]
``````

#### python – Sorting list based on values from another list

Also, if you dont mind using numpy arrays (or in fact already are dealing with numpy arrays…), here is another nice solution:

``````people = [Jim, Pam, Micheal, Dwight]
ages = [27, 25, 4, 9]

import numpy
people = numpy.array(people)
ages = numpy.array(ages)
inds = ages.argsort()
sortedPeople = people[inds]
``````

I found it here:
http://scienceoss.com/sort-one-list-by-another-list/