This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: sorted ignores reverse=True when sorting produces same list
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.7, Python 3.6, Python 3.3, Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: Tomas Dabašinskas, tim.peters
Priority: normal Keywords:

Created on 2017-03-08 05:32 by Tomas Dabašinskas, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg289202 - (view) Author: Tomas Dabašinskas (Tomas Dabašinskas) Date: 2017-03-08 05:32
sorted ignores reverse=True when sorting produces same list, I was expecting reverse regardless of the sorting outcome.

Python 3.5.2 (default, Jul 17 2016, 00:00:00) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> data = [{'name': 'first', 'weight': 1},{'name': 'second', 'weight': 1},{'name': 'third', 'weight': 1}, {'name': 'fourth', 'weight': 1}]
>>> sorted(data, key=lambda x: x['weight'], reverse=True)
[{'name': 'first', 'weight': 1}, {'name': 'second', 'weight': 1}, {'name': 'third', 'weight': 1}, {'name': 'fourth', 'weight': 1}]
>>> sorted(data, key=lambda x: x['weight'], reverse=True) == sorted(data, key=lambda x: x['weight']).reverse()
False

Thanks!
msg289204 - (view) Author: Tim Peters (tim.peters) * (Python committer) Date: 2017-03-08 06:07
Your last line can't possibly return True, because `somelist.reverse()` returns None.

So the last line is irrelevant.  Your complaint appears to be about the line before, which shows that the list retains its original order.

That's expected.  All the keys are equal, so a stable sort _must_ retain the original order (that's what "stable" means).  So that's not a bug - it's a feature.

The idea that `x.sort(reverse=True)` must do the same as `x.sort(); x.reverse()` is something you made up in your head ;-)  That is, the docs don't say that.  What they do say:

"""
reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.
"""

That has no effect on keys that compare equal.  It means that keys that compare "less than" are treated as if they had compared "greater than" instead, and vice versa.

While it may not be immediately obvious, what `x.sort(reverse=True)` is actually equivalent to is the sequence:

x.reverse()
x.sort()
x.reverse()
msg289217 - (view) Author: Tomas Dabašinskas (Tomas Dabašinskas) Date: 2017-03-08 08:16
Thanks for taking time to review and respond Tim! (;
History
Date User Action Args
2022-04-11 14:58:44adminsetgithub: 73940
2017-03-08 08:16:03Tomas Dabašinskassetmessages: + msg289217
2017-03-08 06:07:53tim.peterssetstatus: open -> closed

type: behavior

nosy: + tim.peters
messages: + msg289204
resolution: not a bug
stage: resolved
2017-03-08 05:32:52Tomas Dabašinskascreate