[Python-Dev] decorate-sort-undecorate

Raymond Hettinger raymond.hettinger at verizon.net
Mon Oct 13 15:34:15 EDT 2003


For Py2.4, I propose adding an optional list.sort() argument to support
the decorate-sort-undecorate pattern.
 
The current, pure Python approach to DSU is pure arcana.  It is obscure
enough and cumbersome enough that cmpfunc() tends to get used instead.
 
Built-in C support for DSU requires much less skill to use, results in
more readable code, and runs faster.
 
 
 
Raymond Hettinger
 
 
------ Concept demonstraton ------------------
 
def sort(self, cmpfunc=None, decorator=None):
    """Show how list.sort() could support a decorating function"""
    args = ()
    if cmpfunc is not None:
        args = (cmpfunc,)
    if decorator is None:
        self.sort(*args)
    else:      
        aux = zip(map(decorator, self), self)   # Decorate
        aux.sort(*args)
        self[:] = list(zip(*aux)[1])       # Un-decorate
 
a = 'the Quick brown Fox jumped Over the Lazy Dog'.split()
sort(a)                                # the no argument form is
unchanged
print a, 'Normal sort'
sort(a, lambda x,y: -cmp(x,y))    # old code still works without change
print a, 'Reverse sort'
sort(a, decorator=str.lower)       # the new way is fast, clean, and
readable
print a, 'Lowercase sort'
 
 
# The decorator form works especially well with mappings so that
database
# keys can be sorted by any field. 
 
ages = dict(john=5, amy=3, andrea=32, henry=12)
names = ages.keys()
location = dict(john='alaska', amy='spain', andrea='peru', henry='iowa')
 
sort(names)
print names, '<-- by name'
sort(names, decorator=ages.__getitem__)
print names, '<-- by age'
sort(names, decorator=location.__getitem__)
print names, '<-- by location'
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-dev/attachments/20031013/a4413f54/attachment.html


More information about the Python-Dev mailing list