Reputation: 853
If i have a list of numbers [4,2,5,1,3]
I want to sort it first by some function f
and then for numbers with the same value of f
i want it to be sorted by the magnitude of the number.
This code does not seem to be working.
list5 = sorted(list5)
list5 = sorted(list5, key = lambda vertex: degree(vertex))
Secondary sorting first: list5 is sorted based on magnitude. Primary sorting next: list5 is sorted based on some function of the numbers.
Upvotes: 47
Views: 45737
Reputation: 317
This is how I would do.
s = ['a', 'ac', 'b', 'ab']
s.sort(key=lambda x: (x[0], x[1]) if len(x)>1 else (x[0],))
Result:
['a', 'ab', 'ac', 'b']
Upvotes: 1
Reputation: 51
On a phone, but youcan sort by tuple.
sorted(list5, lambda x: (degree(x),x))
Don't forget the reverse flag if you need it.
Upvotes: 5
Reputation: 1564
From the Python 3 docs on sorting
from operator import itemgetter, attrgetter
student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
#The operator module functions allow multiple levels of sorting. For example, to sort by grade then by age:
sorted(student_tuples, key=itemgetter(1,2))
sorted(student_objects, key=attrgetter('grade', 'age'))
Upvotes: 7
Reputation: 62948
Sort it by a (firstkey, secondkey) tuple:
sorted(list5, key=lambda vertex: (degree(vertex), vertex))
Upvotes: 103