Tcl Source Code

View Ticket
Ticket UUID: 2082681
Title: TIP #326: Add -group option to lsort
Type: Patch Version: TIP Implementation
Submitter: kieranelby Created on: 2008-08-29 16:10:14
Subsystem: 17. Commands I-L Assigned To: dkf
Priority: 9 Immediate Severity:
Status: Closed Last Modified: 2008-09-29 20:39:11
Resolution: Accepted Closed By: dkf
    Closed on: 2008-09-29 13:39:11
This is a patch to add a "-group grpSize" option to lsort to cause
it to treat the list as consisting of groups of grpSize elements,
and to then perform the sort group-wise, keeping the elements within
each group together.

This is similar to what was requested in Feature Request 747083:

A more detailed explanation follows (not quite a TIP yet tho!).

As well as the code change, the patch includes a change to the man page,
but I've not included any test suite changes (are there any existing tests for lsort?).


"Flat" name-value pair lists are ubiquitous in Tcl - consider the
output of "array get", "dict create" or the input to "foreach".

It is surprising then that there is no command to directly sort
such a list by either the name or the value elements, while
preserving the name-value mapping.

Doing so currently requires turning a name-value pair list into
a list of sublists, using the lsort -index option to sort them,
then flattening the list again, which is rather fiddly and

With this proposal, sorting a name-value pair list by the names is
achieved with "lsort -group 2 $myList".


A new option, "-group", taking one parameter, "grpSize" will be
added to the lsort command.

If -group is supplied, the list will be treated as consisting of
groups of grpSize elements, and the groups will be sorted by either
their first element or, if the -index option is used, by the element
within each group given by the first index passed to -index (which
is then ignored by -index).

Elements always remain in the same position within their group.

The list length must be a multiple of grpSize, which in turn must be
at least 2.


| lsort -group 2 {carrot 10 apple 50 banana 25}
returns {apple 50 banana 25 carrot 10}

| lsort -group 2 -index 1 -integer {carrot 10 apple 50 banana 25}
returns {carrot 10 banana 25 apple 50}

| lsort -group 3 -index {0 1} {{Bob Smith} 25 Audi {Jane Doe} 40 Ford}
return {{Jane Doe} 40 Ford {Bob Smith} 25 Audi}
(since Smith, which is at index 1 of element 0 of the first group comes
after Doe, which is at the same position in the next group of 3.)


Only one element in each group can be used for comparison.
User Comments: dkf added on 2008-09-29 20:39:11:
Accepted with modifications and addition of (simple) tests.

kieranelby added on 2008-09-01 22:38:11:

File Deleted - 291304: 

File Added - 291638: grouping_lsort.patch

Logged In: YES 
Originator: YES

File Added: grouping_lsort.patch

kieranelby added on 2008-08-29 23:10:14:

File Added - 291304: grouping_lsort.patch