467,075 Members | 1,134 Online
Bytes | Developer Community
Ask Question

Home New Posts Topics Members FAQ

Post your question to a community of 467,075 developers. It's quick & easy.

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[0] + '] == b[' +
sortPair[0] + ']:\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][1]
if sortList[j][1] == 'A':
compareSym = '>'
elif sortList[j][1] == 'D':
compareSym = '<'
else:
print 'SORT DIRECTION ERROR ' + sortList[j][1]
outStr += curDent + 'elif a[' + sortList[j][0] + '] ' + compareSym
+ ' b[' + sortList[j][0] + ']:\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[2] == b[2]:
if a[1] == b[1]:
if a[0] == b[0]:
return 0
elif a[0] < b[0]:
return 1
else:
return -1
elif a[1] < b[1]:
return 1
else:
return -1
elif a[2] < b[2]:
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." <kr*****@hotmail.com> 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
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
By using this site, you agree to our Privacy Policy and Terms of Use.