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:
- grouping_lsort.patch [download] added by kieranelby on 2008-09-01 22:38:11. [details]