Guido rethinking removal of cmp from sort method
MRAB
python at mrabarnett.plus.com
Tue Mar 29 19:06:51 EDT 2011
On 29/03/2011 21:32, Dan Stromberg wrote:
>
> On Tue, Mar 29, 2011 at 12:48 PM, Ian Kelly <ian.g.kelly at gmail.com
> <mailto:ian.g.kelly at gmail.com>> wrote:
>
> On Tue, Mar 29, 2011 at 1:08 PM, Chris Angelico <rosuav at gmail.com
> <mailto:rosuav at gmail.com>> wrote:
> > On Wed, Mar 30, 2011 at 5:57 AM, MRAB <python at mrabarnett.plus.com
> <mailto:python at mrabarnett.plus.com>> wrote:
> >> You would have to do more than that.
> >>
> >> For example, "" < "A", but if you "negate" both strings you get "" <
> >> "\xBE", not "" > "\xBE".
> >
> > Strings effectively have an implicit character at the end that's less
> > than any other character. Easy fix: Append a character that's greater
> > than any other. So "" < "A" becomes "\xFF" > "\xBE\xFF".
> >
> > Still not going to be particularly efficient.
>
> Not to mention that it still has bugs:
>
> "" < "\0"
> "\xff" < "\xff\xff"
> --
> http://mail.python.org/mailman/listinfo/python-list
>
>
> It probably could be a list of tuples:
>
> 'abc' -> [ (1, chr(255 - ord('a')), (1, chr(255 - ord('b')), (1, chr(255
> - ord('c')), (0, '') ]
>
> ...where the (0, '') is an "end of string" marker, but it's getting
> still slower, and quite a lot bigger, and getting so reductionistic
> isn't a good thing when one class wraps another wraps another - when
> their comparison methods are interrelated.
>
I think I've found a solution:
class NegStr:
def __init__(self, value):
self._value = value
def __lt__(self, other):
return self._value > other._value
so when sorting a list of tuples:
def make_key(t):
return NegStr(t[0]), t[1]
items = [("one", 1), ("two", 2), ("three", 3), ("four", 4),
("five", 5)]
items.sort(key=make_key)
More information about the Python-list
mailing list