467,075 Members | 1,134 Online

# problem with custom sort function .... long

 Hello all, I am relatively new to python but I am having an issue with custom sort functions.. I am trying to sort a list of lists or tuples with arbitrary ascending or descending sorts. For example given a list of tuples ('firstname','lastname','age') I want to be able to sort lastname descending, firstname ascending and age ascending... I wrote a custom function generator to generate a sort function based on an input list of column numbers and sort direction. Sort seems to sort the first column ascending regardless of what the sort function says. I also googled this group for other solutions and found a more elegant one than mine but with the same results. Here is my code and result: sortList = [('2','D'),('1','D'),('0','D')] dataList = [] dataList.append(['a','a','b']) dataList.append(['a','a','a']) dataList.append(['a','a','c']) dataList.append(['a','b','a']) dataList.append(['a','b','b']) dataList.append(['a','b','c']) dataList.append(['a','c','a']) dataList.append(['a','c','b']) outStr = 'def custSort( a, b):\n' depth = 1 for sortPair in sortList: indent = " " curDent = depth * indent outStr += curDent + 'if a[' + sortPair + '] == b[' + sortPair + ']:\n' depth += 1 depth -= 1 outStr += curDent + indent + 'return 0\n' for j in range( len(sortList)-1, -1, -1 ): curDent = depth * indent print sortList[j] if sortList[j] == 'A': compareSym = '>' elif sortList[j] == 'D': compareSym = '<' else: print 'SORT DIRECTION ERROR ' + sortList[j] outStr += curDent + 'elif a[' + sortList[j] + '] ' + compareSym + ' b[' + sortList[j] + ']:\n' outStr += curDent + indent + 'return 1\n' outStr += curDent + 'else:\n' outStr += curDent + indent + 'return -1\n' depth -= 1 print outStr exec( outStr ) dataList.sort( custSort ) print str( dataList ) *************************** results: D D D def custSort( a, b): if a == b: if a == b: if a == b: return 0 elif a < b: return 1 else: return -1 elif a < b: return 1 else: return -1 elif a < b: return 1 else: return -1 [['a', 'b', 'c'], ['a', 'a', 'c'], ['a', 'c', 'b'], ['a', 'b', 'b'], ['a', 'a', 'b'], ['a', 'c', 'a'], ['a', 'b', 'a'], ['a', 'a', 'a']] and Manuel Garcia's solution and results: sortList = [(0,-1),(1,-1),(2,-1)] dataList = [] dataList.append(['a','a','b']) dataList.append(['a','a','a']) dataList.append(['a','a','c']) dataList.append(['a','b','a']) dataList.append(['a','b','b']) dataList.append(['a','b','c']) dataList.append(['a','c','a']) dataList.append(['a','c','b']) def make_sort_f(list0): def f(a,b): for (i,m) in list0: if a[i] == b[i]: continue return m * cmp(a[i],b[i]) return 0 return f dataList.sort( make_sort_f( sortList ) ) print str(dataList) Results: [['a', 'c', 'b'], ['a', 'c', 'a'], ['a', 'b', 'c'], ['a', 'b', 'b'], ['a', 'b', 'a'], ['a', 'a', 'c'], ['a', 'a', 'b'], ['a', 'a', 'a']] is this an issue with sort or is my code screwy? Thanks in advance for any help! Ken R. Jul 18 '05 #1
• viewed: 3149
Share:
2 Replies
 "Ken R." wrote in message news:1e*************************@posting.google.co m... Hello all, I am relatively new to python but I am having an issue with custom sort functions.. Athough they seem to be working fine! I am trying to sort a list of lists or tuples with arbitrary ascending or descending sorts. For example given a list of tuples ('firstname','lastname','age') I want to be able to sort lastname descending, firstname ascending and age ascending... I wrote a custom function generator to generate a sort function based on an input list of column numbers and sort direction. Sort seems to sort the first column ascending regardless of what the sort function says. I also googled this group for other solutions and found a more elegant one than mine but with the same results. Given that your example data all have 'a' in the first column, these statements of ill behavior make no sense! Here is my code and result: sortList = [('2','D'),('1','D'),('0','D')] dataList = [] dataList.append(['a','a','b']) dataList.append(['a','a','a']) dataList.append(['a','a','c']) dataList.append(['a','b','a']) dataList.append(['a','b','b']) dataList.append(['a','b','c']) dataList.append(['a','c','a']) dataList.append(['a','c','b']) You could just as well write dataList as a single literal. [snip] [['a', 'b', 'c'], ['a', 'a', 'c'], ['a', 'c', 'b'], ['a', 'b', 'b'], ['a', 'a', 'b'], ['a', 'c', 'a'], ['a', 'b', 'a'], ['a', 'a', 'a']] and columns 2, 1, and 0 are descending (non-increasing) in that order, just as you asked. What different were you expecting given the input. and Manuel Garcia's solution and results: sortList = [(0,-1),(1,-1),(2,-1)] .... Results: [['a', 'c', 'b'], ['a', 'c', 'a'], ['a', 'b', 'c'], ['a', 'b', 'b'], ['a', 'b', 'a'], ['a', 'a', 'c'], ['a', 'a', 'b'], ['a', 'a', 'a']] Again, just as requested. Same question. is this an issue with sort or is my code screwy? Perhaps your understanding of ascending and descending? or of nested sorting? Terry J. Reedy Jul 18 '05 #2
 > Given that your example data all have 'a' in the first column, these statements of ill behavior make no sense! Oh my! One would think that I just dashed off a question to the group without spending any time on the problem (not the case). No excuses for my oversight but thanks for your gentle reply :). Jul 18 '05 #3

### This discussion thread is closed

Replies have been disabled for this discussion.

### Similar topics

 2 posts views Thread by Rachel Forder | last post: by 20 posts views Thread by Xah Lee | last post: by 3 posts views Thread by Ed Sutton | last post: by 5 posts views Thread by TM | last post: by reply views Thread by Gene Hubert | last post: by 3 posts views Thread by Neil | last post: by 2 posts views Thread by Emma Burrows | last post: by 5 posts views Thread by Ethan Strauss | last post: by reply views Thread by =?iso-8859-1?Q?=22Orlando_D=F6hring=22?= | last post: by 6 posts views Thread by Otekpo Emmanuel | last post: by reply views Thread by SwissProgrammer | last post: by 2 posts views Thread by SwissProgrammer | last post: by 3 posts views Thread by SwissProgrammer | last post: by 3 posts views Thread by SwissProgrammer | last post: by 4 posts views Thread by Ariiza13 | last post: by reply views Thread by SwissProgrammer | last post: by 5 posts views Thread by SueHopson | last post: by reply views Thread by rhonda6373 | last post: by