How to Sort this array

Sean 'Shaleh' Perry shalehperry at attbi.com
Sat Oct 26 04:28:25 EDT 2002


On Friday 25 October 2002 23:23, Hai Wu wrote:
> How to sort an array with numbers like 021025_11441 in it? It needs to be
> sorted first by the number before '_', then sorted by the number after '_'?
> How to do it using a customized sort function?
>

the usual tactic is to write a comparison function and pass this to .sort().

parts = ['021025_11441', '876432_19532', '243756_98652', '565438_67453']

def part_sort(a, b):
    return cmp(a,b)

parts.sort(part_sort)

The part_sort function uses the builtin cmp() which returns -1 if a is less 
than b, 0 if a equals b, or 1 is a is greater than b.  So far we are no 
better than just calling .sort() without a function.  Let's make a better 
sorter.

def part_sort2(a, b):
    a_left, a_right = a.split('_')
    b_left, b_right = b.split('_')

    return cmp(int(a_left), int(b_left)) or cmp(int(a_right), int(b_right))

this splits the values on underscore and then calls cmp().  We use int() to 
turn each piece into a number for better sorting.  The sorter works like 
this:

if a_left < b_left:
    return -1
else if a_left > b_left:
    return 1
else if a_right < b_right:
    return -1
else if a_right > b_right:
    return 1
else:
    return 0

the key is the second call to cmp() is not made if the first one yields a 
result other than equal to.

Hope this helps.




More information about the Python-list mailing list