Satya Upadhya wrote: > Dear Friends, > I am having a few issues with respect to sorting using python. I am using > Python 2.4.3 Win32 (IDLE 1.1.3). > >>>> x = [2,6,4] >>>> x.sort() >>>> x > [2, 4, 6] >>>> x = [2,6,4] >>>> y = [] >>>> y = x.sort() >>>> y >>>> print y > None > > So the problem essentially is that i am unable to store the sorted > elements of list x into an empty list y in a straightforward manner. I can > get around this, of course, using the following: >>>> x = [2,6,4] >>>> x.sort() > > >>> x > [2, 4, 6] >>>> y = [] >>>> for i in x: > y.append(i) > > >>>> y > [2, 4, 6] > > But this seems a little less succinct then one would expect from python. > Not only that, but you've also modified the original list, which seems to conflict with your requirements.
> Also, consider the sorting of the indices of a sorted list. Consider the > following code: >>>> x = [2,6,4] >>>> import operator >>>> sortedindices = sorted(range(len(x)), key = x.__getitem__) >>>> print sortedindices > [0, 2, 1] >>>> x.sort() >>>> x > [2, 4, 6] >>>> > > x (x = [2,6,4] originally) is the original list, and its indice > s are > 0,1,2. If you sort x, then x becomes [2,4,6] and the the list of the > sorted > indices becomes [0,2,1] since the 4 (which originally corresponds > to index 2) has now shifted to a position corresponding to index 1 and > likewise for element 6. > > The equivalent matlab code for getting the sorted indices is much simpler: > if x is a list (array) of values, then just write: > > [y,i] = sort(x); > and y will be a list containing the sorted elements of x and i will be a > list containing the sorted indices. > > Am i missing a trick here? > > Thanking you, > Satya > >>> sorted <built-in function sorted> >>> a = [9,4,3,5,2,6,7,1,2] >>> b = sorted(a) >>> a [9, 4, 3, 5, 2, 6, 7, 1, 2] >>> b [1, 2, 2, 3, 4, 5, 6, 7, 9] >>> Remember that sort() was specifically designed top operate on a list in-place, so it always returns None. If you want the indexes as well you need to become a bit tricky. Remember that enumerate() will produced two-element tuples with the index value associated with the list value. >>> [x for x in enumerate(a)] [(0, 9), (1, 4), (2, 3), (3, 5), (4, 2), (5, 6), (6, 7), (7, 1), (8, 2)] But you really want the index second, so the sort works on the list values not the index values. Combining all this we get >>> sorted((x[1], x[0]) for x in enumerate(a)) [(1, 7), (2, 4), (2, 8), (3, 2), (4, 1), (5, 3), (6, 5), (7, 6), (9, 0)] Tadaaa! regards Steve -- Steve Holden +44 150 684 7255 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://holdenweb.blogspot.com Recent Ramblings http://del.icio.us/steve.holden -- http://mail.python.org/mailman/listinfo/python-list