Matlab post
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.
org-mode source