>>> a =[5,2,3,1,4] >>> a.sort() >>> a [1, 2, 3, 4, 5] >>> sorted({1:'D',2:'B',3:'B',4:'E',5:'A'}) [1, 2, 3, 4, 5] >>> sorted("This is a test string from Andrew".split(), key =str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] >>> student_tuples=[ ... ('john','A',15 ), ... ('jane','B',12 ), ... ('dave','B',10 ), ... ] >>> sorted(student_tuples, key = lambda student: student[ 2]) # sort by age [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>>classStudent : ... def __init__ (self, name, grade, age): ... self.name =name ... self.grade =grade ... self.age =age ... def __repr__ (self): ... return repr(( self.name,self.grade,self.age)) >>> student_objects=[ ... Student( 'john','A',15 ), ... Student( 'jane','B',12 ), ... Student( 'dave','B',10 ), ... ] >>> sorted(student_objects, key = lambda student: student .age) # sort by age [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] The same technique works for objects with named attributes. For example: A common pattern is to sort complex objects using some of the object’s indices as keys. For example: The value of the key parameter should be a function (or other callable) that takes a single argument and returns a key to use for sorting purposes. This technique is fast because the key function is called exactly once for each input record. For example, here’s a case-insensitive string comparison: Both$_{list.sort()}$ and$_{sorted()}$ have a key parameter to specify a function (or other callable) to be called on each list element prior to making comparisons. Another difference is that the list.sort() method is only defined for lists. In contrast, the sorted() function accepts any iterable. 2 Key Functions 2