I have a list of strings like this:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
What is the shortest way of sorting X using values from Y to get the following output?
["a", "d", "h", "b", "c", "e", "i", "f", "g"]
The order of the elements having the same "key" does not matter. I can resort to the use of for
constructs but I am curious if there is a shorter way. Any suggestions?
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 two list
s.list
based on the zip
using sorted()
.list
.For more information on how to set\use the key
parameter as well as the sorted
function in general, take a look at this.