[Zope] dtml-in sorting on lists
Oleg Broytmann
Oleg Broytmann <phd@phd.pp.ru>
Tue, 16 Apr 2002 12:15:09 +0400
On Mon, Apr 15, 2002 at 06:10:38PM -0400, ririe@spininternet.com wrote:
> I would like to use dtml-in's sort functionality, but on indices
> of lists, not attributes.
>
> Basically, I have a function, say getLoL() that generates a list of
> lists ( e.g. [ [A1,A2,A3],[B1,B2,B3], ...]
>
> I can use dtml-in to loop through this like:
>
> <dtml-in expr="getLoL()">
> First index: <dtml-var expr="_.getitem('sequence-item')[0]">
> </dtml-in>
>
> How can I now sort based on say the second index of the sequence-item?
> (ie sort A2, B2, C2, etc)
>
> I've looked at the DT_In.py code, and think I need to make
> modifications to allow for indexing (as opposed to getattr's)
> but was wondering if there was an existing way.
In Zope 2.5+ all things are already there; source code is in the
DocumentTemplate/sequence directory, but it is already attached to dtml-in.
Usage (this is general Extended DTML Sorting HOWTO):
<dtml-in mysequence sort="sortDesciption">
SortDescription is a list of sort options, separated by comma. Every
sort option defines a field to sort upon, sort (comparison) function, and
sort direction (ascending/descending); fileds in a sort option separated by
slash.
Examples:
<dtml-in mydocuments sort="date/cmp/desc,title">
<dtml-in mydocuments sort="date/cmp/desc,title/locale">
<dtml-in mydocuments sort="date/cmp/desc,title/locale_nocase">
There are few predefined comparison functions: cmp (standard builtin
cmp), nocase (case-insensitive cmp); id Zope had been started with
-L locale parameter, there are also locale-aware functions: locale (alias
strcoll) and locale_nocase (strcoll_nocase).
If predfined functions do not suite one's needs, one can write his/her
own function. The entire framework make the writing very simple - you only
need to write a cmp-like function that compares two values and return -1, 0
or 1.
Unfortunately for you, dtml-in sort may be used only with lists of
objects or lists of dictionaries.
So I recommend you to write an External Method or Python Script that
sorts the list. Something like this:
def sortListsBy2ndElement(l1, l2):
return cmp(l1[1], l2[1])
def mySort(myListOfLists):
myListOfLists.sort(sortListsBy2ndElement)
Oleg.
--
Oleg Broytmann http://phd.pp.ru/ phd@phd.pp.ru
Programmers don't die, they just GOSUB without RETURN.