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@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor