0
sorter_lst = [4,-1,5,6,7,-2]
lst_a = [1,2,3,4,5,6]
lst_b = [7,8,9,10,11,12]
lst_c = [13,14,15,16,17,18]

desired output is all lists sorted by the sorter_lst

lst_a = [6,2,1,3,4,5]
lst_b = [12,8,7,9,10,11]
lst_c = [18,14,13,15,16,17]

I would like to do this in one line with one sort. I know it can be done in 3 lines like this

lst_a = [a for (y,a) in sorted(zip(sorter_lst,lst_a),key=lambda pair: pair[0])]
lst_b = [b for (y,b) in sorted(zip(sorter_lst,lst_b),key=lambda pair: pair[0])]
lst_c = [c for (y,c) in sorted(zip(sorter_lst,lst_c),key=lambda pair: pair[0])]

But I am looking for a more efficient way to do this.

What I have tried...

test_output = [[a,b,c] for (y,a,b,c) in sorted(zip(sorter_lst,lst_a,lst_b,lst_c),key=lambda pair: pair[0])]

which gives me

test_output = [[5,11,17],[2,8,14],[6,12,18],[1,7,13],[3,9,15],[4,10,16]]

The first entry of test_output contains index 0 of the desired output of lst_a, lst_b, and lst_c.

1 Answer 1

2

You can use zip twice:

sorter_lst = [4,-1,5,6,7,-2]
lst_a = [1,2,3,4,5,6]
lst_b = [7,8,9,10,11,12]
lst_c = [13,14,15,16,17,18]

_, lst_a, lst_b, lst_c = zip(*sorted(zip(sorter_lst, lst_a, lst_b, lst_c)))

print(lst_a) # (6, 2, 1, 3, 4, 5)
print(lst_b) # (12, 8, 7, 9, 10, 11)
print(lst_c) # (18, 14, 13, 15, 16, 17)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.