[Python-Dev] The list.sort(reverse=True) method not consistent with description
Dear Python developers, The help(list) shows in a python console the following documentation string for the list.sort() method. sort(self, /, *, key=None, reverse=False) | Sort the list in ascending order and return None. | | The sort is in-place (i.e. the list itself is modified) and stable (i.e. the | order of two equal elements is **maintained**). Please notice the following inconsistency in Python3.10.0 and before of a sort(reverse=True) result: >>> L = [(1, 'a'), (2, 'b'), (1, 'c'), (2, 'd'), (3, 'e')] >>> L.sort(reverse=True) >>> L >>> [(3, 'e'), (2, 'd'), (2, 'b'), (1, 'c'), (1, 'a')] it should be: >>> L = [(1, 'a'), (2, 'b'), (1, 'c'), (2, 'd'), (3, 'e')] >>> reverseTuplesSort(L) [(3, 'e'), (2, 'b'), (2, 'd'), (1, 'a'), (1, 'c')] Same inconsistency appears when using a sorting key. Passing easily unnoticed may produce unexpected and potentially wrong ranking results. Best Regards, RB -- 50, Bvd G.-D. Charlotte L-1330 Luxembourg GD Luxembourg (Europe) (+352) 621 175 242 ___ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/KQ2KWZ63YZMHOYAK7PJ322I5EFFBTLXW/ Code of Conduct: http://python.org/psf/codeofconduct/
[Python-Dev] Re: The list.sort(reverse=True) method not consistent with description
Dear All, I fully agree with your point. By default, all the components of the tuple should be used in the comparison. Yet, I was confused by the following result. >>> from operator import itemgetter >>> L = [(1, 'a'), (2, 'b'), (1, 'c'), (2, 'd'), (3, 'e')] >>> L.sort(key=itemgetter(0), reverse=True) >>> L = [(3, 'e'), (2, 'd'), (2, 'b'), (1, 'c'), (1, 'a')] Should the tuples comparison is in this case, I thought, not be solely based on the first tuple component? Best Regards On 10/30/21 18:26, Tim Peters wrote: [Raymond Bisdorff ] ... Please notice the following inconsistency in Python3.10.0 and before of a sort(reverse=True) result: >>> L = [(1, 'a'), (2, 'b'), (1, 'c'), (2, 'd'), (3, 'e')] >>> L.sort(reverse=True) >>> L >>> [(3, 'e'), (2, 'd'), (2, 'b'), (1, 'c'), (1, 'a')] Looks good to me. it should be: >>> L = [(1, 'a'), (2, 'b'), (1, 'c'), (2, 'd'), (3, 'e')] >>> reverseTuplesSort(L) [(3, 'e'), (2, 'b'), (2, 'd'), (1, 'a'), (1, 'c')] Stability is irrelevant in the example, because no two list elements are equal. You appear to be thinking, perhaps, that s[0] == t[0] when s == (1, 'a') and t == (1, 'c') means s and t "are equal", but that's not so at all. s = (1, 'a') t = (1, 'c') s == t False s < t True t > s True So s MUST come before t in a forward sort, and t MUST come before s in a reverse sort. -- 50, Bvd G.-D. Charlotte L-1330 Luxembourg GD Luxembourg (Europe) (+352) 621 175 242 ___ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/NM7YIVWWHMSVGY4GHLSK64MBRO6A7GE2/ Code of Conduct: http://python.org/psf/codeofconduct/
[Python-Dev] Re: The list.sort(reverse=True) method not consistent with description
Dear All, You are all completely right. Sorry for the confusion. Thank you all very much for putting my mind right about this issue. Best Regards Raymond Bisdorff > On 30 Oct 2021, at 19:00, Tim Peters wrote: > > [Raymond Bisdorff ] >> I fully agree with your point. By default, all the components of the >> tuple should be used in the comparison. >> >> Yet, I was confused by the following result. >>>>> from operator import itemgetter >>>>> L = [(1, 'a'), (2, 'b'), (1, 'c'), (2, 'd'), (3, 'e')] >>>>> L.sort(key=itemgetter(0), reverse=True) >>>>> L = [(3, 'e'), (2, 'd'), (2, 'b'), (1, 'c'), (1, 'a')] >> >> Should the tuples comparison is in this case, I thought, not be solely >> based on the first tuple component? > > I'm not sure what you're doing there. The last line in your example > isn't showing the result of sorting, it's assigning a brand new list > to `L`' Here the same thing, but changing the last line to show the > result of sorting: > >>>> from operator import itemgetter >>>> L = [(1, 'a'), (2, 'b'), (1, 'c'), (2, 'd'), (3, 'e')] >>>> L.sort(key=itemgetter(0), reverse=True) >>>> L > [(3, 'e'), (2, 'b'), (2, 'd'), (1, 'a'), (1, 'c')] > > So stability does matter when comparing only the tuples' first > components, and tuples with the same first component did retain their > original order. ___ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/WI3E6UFVJMIK6UBXWLA4HLHQ4IVFZDNN/ Code of Conduct: http://python.org/psf/codeofconduct/