The simplest way to achieve what you want is to use the fact that python sort is stable. This allows to first sort alphabetically and then by score:
In [11]: results = [(10, 'Mary'), (9, 'John'), (10, 'George'), (9, 'Frank'), (9, 'Adam')]
In [12]: results.sort(key=lambda x: x[1])
In [13]: results.sort(key=lambda x: x[0], reverse=True)
In [14]: results
Out[14]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]
The first sort sorts alphabetically, in ascending order. The second sort sorts by score, in descending order, maintaining the relative order of elements with equal score.
You can do this to do even more complex sorts. Just remember that you must first sort by the secondary key, and then by the first key. (If you have three keys, first sort by the third, then by the second, and lastly by the main key).
If you don't want to call sort
twice you'll have to write a more complex key
function. Something like:
In [50]: def key(elem):
...: return elem[0], [-ord(c) for c in elem[1]]
In [51]: sorted(results, key=key, reverse=True)
Out[51]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]
In particular, every time you have something sorted in lexicographic order(such as strings, tuples, lists etc.), you can invert the order by changing the sign to all the elements.