partial list sort

jsaul jsaul at gmx.de
Wed Oct 9 05:41:41 EDT 2002


Hi there,

I am looking for the proper way to sort a list range-wise. The
scenario is as follows: I am reading a list of data elements
triple-wise component A, B and C, then the next triple A, B, C and
so on.  Each list element has a component identifier which takes
the values "A", "B", or "C". What I want is to sort the components
within each *triple*, but *not* the while list, so that I can
assure an order of A-B-C no matter what the original order in the
data was, which can as well be B-C-A or whatever.

Here is a simplified version of my script illustrating the
problem:

    list=[ [1,'C'], [2,'B'], [3,'A'], [4,'C'], [5,'B'], [6,'A'] ]
    print list

    def sort_components (list):
	def cmp_comp (data1, data2):
	    if   data1[1] == data2[1]:  return  0
            elif data1[1]  < data2[1]:  return -1
	    return 1
        print list
	list.sort(cmp_comp)
        print list
	return

    for k in range(0, len(list), 3):
	# sort over ranges:
        sort_components(list[k:k+3])

    print list

The resulting output is:

    [[1, 'C'], [2, 'B'], [3, 'A'], [4, 'C'], [5, 'B'], [6, 'A']]
    [[1, 'C'], [2, 'B'], [3, 'A']]
    [[3, 'A'], [2, 'B'], [1, 'C']]
    [[4, 'C'], [5, 'B'], [6, 'A']]
    [[6, 'A'], [5, 'B'], [4, 'C']]
    [[1, 'C'], [2, 'B'], [3, 'A'], [4, 'C'], [5, 'B'], [6, 'A']]

What I want is

    [[3, 'A'], [2, 'B'], [1, 'C'], [6, 'A'], [5, 'B'], [4, 'C']]

You see that *within* the function 'sort_components' each triple
is sorted properly, but after leaving that function, the sorting
is not retained. I want to sort the list triple-wise preferably
*without* restructuring the list.

Can anybody give me a hint about what I have overlooked?

Cheers, jsaul
-- 
Que le gusta rrrodarrr la errre.



More information about the Python-list mailing list