On Wednesday, March 21, 2018 at 5:30:08 AM UTC-7, Anthony wrote: > > I have a different application, where I want to order the rows according >> to a string field, where the string field has a prefix and a suffix, and >> the suffix is the dominant part of the ordering: >> >> 4321A < 0123B, >> 2345D < 5432D >> >> > The simplest and most efficient method is probably to let the database do > the sorting. In SQLite, you can use the substr() function: > > rows = db(query).select(..., orderby='substr(mytable.myfield, -1), > mytable.myfield') > > substr(mytable.myfield, -1) selects the last character of myfield (use -2 > for the last 2 characters, etc.). Adding mytable.myfield to the orderby > breaks any ties by ordering based on the beginning characters of the field. >
That looks pretty straightforward, once I realize the substr() function is available =8-0 > > >> It's really easy to write a custom cmp() for this, and then to do >> sorted(rows, >> mycmp), but the result is a list, not a Rows object; in particular, it >> loses the colnames. If I do >> db(query1).select().sort(mycmp), >> that fails because mycmp() requires 2 arguments, but 1 given. >> > > The "key" function passed to the Python sorted() function should take only > a single argument -- an element from the iterator being sorted. If your > mycmp requires two arguments, then it should fail with sorted() as well as > with Rows.sort(). Just rewrite mycmp so it takes only one argument (a Row > object). > Ah, the "key" argument. That's what's going on. sorted() has both a cmp and key argument, and I viewed this as a cmp problem. > > >> Or if I use sorted(), how do I turn list back into a Rows object? >> (Okay, there's a work-around for this ... write the view to handle a list, >> rather than having a default view, but one of these days I'm bound to need >> a Rows object.) >> > > Try: > > rows.records = sorted(rows, mycmp) > > Though, as noted above, rows.sort(mycmp) should work just as well (it uses > sorted() internally). > > Anthony > Thanks, it sounds like I was focusing on the wrong area. I guess I should have peeked in at rows.sort() to see how it worked. As always, you're on top of the game. /dps -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

