Tcl Source Code

View Ticket
Login
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
Description:
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:

https://sourceforge.net/tracker/index.php?func=detail&aid=747083&group_id=10894&atid=360894

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?).

Rationale
=========

"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
inefficient.

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

Specification
=============

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.

Examples
========

| 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.)

Limitations
===========

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 
user_id=99072
Originator: YES

File Added: grouping_lsort.patch

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

File Added - 291304: grouping_lsort.patch

Attachments: