Sorting in python
Posted February 27, 2013 at 02:45 PM | categories: python | tags:
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')] def grade_key(gtup): '''gtup is a tuple of ('groupname', 'lettergrade')''' lettergrade = gtup[1] 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--'] return grades.index(lettergrade) print sorted(groups, key=grade_key)
[('group2', 'A+'), ('group3', 'A'), ('group1', 'B')]
Copyright (C) 2013 by John Kitchin. See the License for information about copying.