Breaking ties in Python sort
python, sorting
Solution
Use a `key` function to `sorted()` and return a tuple; values will be sorted lexicographically:
sorted(yourlst, key=lambda t: (abs(t[0] - t[1])), t[0]), reverse=True)
I'm using `abs()` here to calculate a difference, regardless of which of the two integers is larger.
For your sample input, the key produces `(1, 5)`, `(3, 4)` and `(1, 6)`; in reverse order that puts `(1, 6)` (for the `(6, 7)` tuple) before `(1, 5)` (corresponding with `(5, 6)`).
Demo:
>>> yourlst = [(5, 6), (4, 1), (6, 7)]
>>> sorted(yourlst, key=lambda t: (abs(t[0] - t[1]), t[0]), reverse=True)
[(4, 1), (6, 7), (5, 6)]
Problem
I have a `list` of `tuple`s, each tuple contains two integers. I need to sort the the list (in reverse order) according to the difference of the integers in each tuple, but break ties with the larger first integer. Example For `[(5, 6), (4, 1), (6, 7)]`, we should get `[(4, 1), (6, 7), (5, 6)]`. My way I have already solved it by making a `dictionary` that contains the difference as the `key` and the tuple as the `value`. But the whole thing is a bit clumsy. What is a better way?