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:
zip
the twolist
s.- create a new, sorted
list
based on thezip
usingsorted()
. - 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/