[Python-Dev] The list.sort(reverse=True) method not consistent with description

2021-10-30 Thread Raymond Bisdorff

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

2021-10-30 Thread Raymond Bisdorff

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

2021-10-30 Thread Raymond Bisdorff
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/