## Sorting in python

| categories: python | tags: | View Comments

Occasionally it is important to have sorted data. Python has a few sorting options.

a = [4, 5, 1, 6, 8, 3, 2]
print a
a.sort()  # inplace sorting
print a

a.sort(reverse=True)
print a

[4, 5, 1, 6, 8, 3, 2]
[1, 2, 3, 4, 5, 6, 8]
[8, 6, 5, 4, 3, 2, 1]


If you do not want to modify your list, but rather get a copy of a sorted list, use the sorted command.

a = [4, 5, 1, 6, 8, 3, 2]
print 'sorted a = ',sorted(a)  # no change to a
print 'sorted a = ',sorted(a, reverse=True)  # no change to a
print 'a        = ',a

sorted a =  [1, 2, 3, 4, 5, 6, 8]
sorted a =  [8, 6, 5, 4, 3, 2, 1]
a        =  [4, 5, 1, 6, 8, 3, 2]


This works for strings too:

a = ['b', 'a', 'c', 'tree']
print sorted(a)

['a', 'b', 'c', 'tree']


Here is a subtle point though. A capitalized letter comes before a lowercase letter. We can pass a function to the sorted command that is called on each element prior to the sort. Here we make each word lower case before sorting.

a = ['B', 'a', 'c', 'tree']
print sorted(a)

# sort by lower case letter
print sorted(a, key=str.lower)

['B', 'a', 'c', 'tree']
['a', 'B', 'c', 'tree']


Here is a more complex sorting problem. We have a list of tuples with group names and the letter grade. We want to sort the list by the letter grades. We do this by creating a function that maps the letter grades to the position of the letter grades in a sorted list. We use the list.index function to find the index of the letter grade, and then sort on that.

groups = [('group1', 'B'),
('group2', 'A+'),
('group3', 'A')]

'''gtup is a tuple of ('groupname', 'lettergrade')'''

grades = ['A++', 'A+', 'A', 'A-', 'A/B'
'B+', 'B', 'B-', 'B/C',
'C+', 'C', 'C-', 'C/D',
'D+', 'D', 'D-', 'D/R',
'R+', 'R', 'R-', 'R--']


[('group2', 'A+'), ('group3', 'A'), ('group1', 'B')]