[Tutor] understanding the behavious of parameter 'key' in sort

Shashwat Anand anand.shashwat at gmail.com
Tue Nov 24 11:14:44 CET 2009


it was a bit tricky, thanks :)

On Tue, Nov 24, 2009 at 9:00 AM, Lie Ryan <lie.1296 at gmail.com> wrote:

> Shashwat Anand wrote:
>
>> I intended to sort a list which sorts according to user-defined custom
>> sorting-order.
>> For example: If sorting-order is "zabc...wxy", then the output will be in
>> lexicographically sorted order but z will always be given priority over rest
>> others.
>> as a test case i took sorting order as reverse of normal sorting, hence i
>> defined user_key as string.ascii_lowercase. It should sort in reverse manner
>> but I'm not getting expected output.
>> (Even though it could have just been sorted as reverse=True, but my
>> intention is to generalize it for this is just a test-case). I'm not able to
>> find where the bug lies nor am i exactly sure how the key function works,
>> even though i use it in a regular fashion. Can you guys help me out ?
>>
>
> Your code is not wrong. It's your expected output (or your need) that's
> different from a typical definition of "lexicographical sorting". In a
> typical lexicographical sorting "a" comes before "ab" since "a" is shorter
> than "ab".
>
>
> So, if you want this:
>
>  expected output: ['cba', 'cab', 'abc', 'ab', 'aa', 'a']
>>
> you must use a custom cmp= argument to reverse the shorter substring case:
>
>
> like this:
>
> import string
>
> def my_cmp(s1, s2):
>    if s1.startswith(s2):
>        return -1
>    elif s2.startswith(s1):
>        return 1
>    else:
>        return cmp(s1, s2)
>
>
> def userdef_sort(l, user_key):
>    table = string.maketrans("".join(sorted(user_key)), user_key)
>    trans = lambda x: x.translate(table)
>    return sorted(l, cmp=my_cmp, key=trans)
>
>
> #user_key = raw_input()
> user_key = string.ascii_lowercase[::-1]
> l = ['a', 'aa', 'ab', 'abc', 'cba', 'cab']
>
> print userdef_sort(l, user_key)
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20091124/f9eb73e5/attachment.htm>


More information about the Tutor mailing list