Comparisons of incompatible types

Steven D'Aprano steve+comp.lang.python at pearwood.info
Thu Dec 9 02:58:29 EST 2010


On Wed, 08 Dec 2010 20:16:57 -0800, John Nagle wrote:

>     Here's an example where this issue produces invalid results in
>     Python.
> 
>  >>> NaN = float("nan")
>  >>> arr = [1.0, 4.0, 3.0, 2.0, 5.0, NaN, 6.0, 3.0, NaN, 0.0, 1.0, 4.0,
> 3.0, 2.0, 5.0, NaN, 6.0, 3.0, NaN, 0.0]
>  >>> sorted(arr)
> [0.0, 0.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 5.0, nan, 5.0,
> 6.0, nan, 4.0, nan, 6.0, nan]
> 
> The sorted numerical values aren't in order. Note the 4.0 near the end,
> after the 6.0.  "sort" has failed because it assumes that a < b and b <
> c implies a < c. But that's not a valid assumption here.
> 
> It's not good to break trichotomy.

It's perfectly fine to break trichotomy. People do it all the time -- 
they prefer chicken to pizza, pizza to steak, but prefer steak to 
chicken. (Modulo whatever foods you prefer. Or sports, or politicians, or 
any one of many things which don't make up an equivalence relationship.) 
Equivalence relationships make up only a tiny portion of relationships, 
and it is both useful and conventional to use the same operators in both 
situations. 

What's not good is to assume trichotomy when it doesn't apply, but that's 
no different from any other faulty assumption, e.g. a coder who assumes 
multiplication is always commutative may be puzzled why his matrix 
calculations are frequently wrong.

Python's sort assumes trichotomy, even when sorting floats. Perhaps it 
shouldn't. But one way or another, that's an issue with sort, not with 
the idea that there are data types where trichotomy doesn't apply. And 
like it or not, floats are one of those data types, just as neither 
commutativity nor associativity applies to floats -- even excluding NANs 
and INFs.



-- 
Steven



More information about the Python-list mailing list