On Wed, Jul 16, 2003 at 07:25:20PM +1000, Andrew Savige wrote:
> Perhaps I am posting this to wrong list, but that has become the norm
> lately. :-)
> 
> I noticed on this page:
>  http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52234
> titled "a guaranteed-stable sort with the decorate-sort-undecorate
> idiom (aka Schwartzian transform)"
> --------------------------------------------------------------------
> "decorate-sort-undecorate" is a general and common idiom that allows
> very flexible and speedy sorting of Python sequences. An auxiliary
> list is first built (the 'decorate' step) where each item is made
> up of all sort-keys (in descending order of significance) of the
> corresponding item of the input sequence (must include all of the
> information in the whole corresponding item, and/or an index to it
> so we can fetch it back [or reconstruct it] in the third step).
> This is then sorted by its builtin sort method without arguments.
> Finally, the desired sorted-list is extracted/reconstructed by
> "undecorating" the now-sorted auxiliary-list.
> [This idiom is also known as "Schwartzian transform" by analogy with
> a similar Perl idiom (which, however, implies using map and grep and
> performing the whole sequence inside one single statement)].
> --------------------------------------------------------------------
> 
> So these Python Johnnies think the Schwartzian transform uses grep,
> eh? I wish they gave an example.
> 
> I may regret this, but I was just wondering if it would be more
> accurate to describe this Python decorate-sort-undecorate (DSU)
> thingy as a Guttman-Rosler transform? I suggest this because they
> state that using the builtin sort method without arguments is
> essential for performance reasons. My understanding is that the GR
> transform always uses the bald sort without arguments while the
> Schwartzian transform always uses a sort block. Is that right?

Yes.  GRT usually have the form:

    @sort = map { ... }
            sort
            map { ... } @unsorted;

with often pack/unpack in the map blocks, while an ST is usually
structured as:

    @sort = map  {$_ -> [0]}
            sort { ... }
            map  {[$_ => ...]} @unsorted;


Abigail

Reply via email to