Say I have
votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}
I understand
print(sorted(votes.items(), key=lambda x: x[1]))
will lead to
[('Able', 10), ('Dog', 15), ('Baker', 20), ('Charlie', 20)]
But how does this work?
One of the most powerful components of sorted() is the keyword argument called key . This argument expects a function to be passed to it, and that function will be used on each value in the list being sorted to determine the resulting order. The resulting order is a list with a string order of shortest to longest.
Keyword arguments (or named arguments) are values that, when passed into a function, are identifiable by specific parameter names. A keyword argument is preceded by a parameter and the assignment operator, = . Keyword arguments can be likened to dictionaries in that they map a value to a keyword.
Arguments of sort and sorted Both sort and sorted have three keyword arguments: cmp , key and reverse .
sorted() sorted() method sorts the given sequence as well as set and dictionary(which is not a sequence) either in ascending order or in descending order(does unicode comparison for string char by char) and always returns the a sorted list. This method doesn't effect the original sequence.
The function you pass in to key
is given each of the items that are being sorted, and returns a "key" that Python can sort by. So, if you want to sort a list of strings by the reverse of the string, you could do this:
list_of_strings.sort(key=lambda s: s[::-1])
This lets you specify the value each item is sorted by, without having to change the item. That way, you don't have to build a list of reversed strings, sort that, then reverse them back.
# DON'T do this
data = ['abc', 'def', 'ghi', 'jkl']
reversed_data = [s[::-1] for s in data]
reversed_data.sort()
data = [s[::-1] for s in reversed_data]
# Do this
data.sort(key=lambda s: s[::-1])
In your case, the code is sorting each item by the second item in the tuple, whereas normally it would initially sort by the first item in the tuple, then break ties with the second item.
>>> votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}
If we apply .items()
on the votes
dictionary above we get:
>>> votes_items=votes.items()
>>> votes_items
[('Charlie', 20), ('Baker', 20), ('Able', 10), ('Dog', 15)]
#a list of tuples, each tuple having two items indexed 0 and 1
For each tuple, the first index [0]
are the strings ('Charlie','Able','Baker','Dog'
) and the second index [1]
the integers (20,10,20,15
).
print(sorted(votes.items(), key = lambda x: x[1]))
instructs python to sort the items(tuples)
in votes
using the second index [1]
of each tuple, the integers, as the basis of the sorting.
Python compares each integer from each tuple and returns a list that has ranked each tuple in ascending order (this can be reversed with the reverse=True
argument) using each tuple's integer as the key
to determine the tuple's rank,
Where there is a tie in the key, the items are ranked in the order they are originally in the dictionary. (so ('Charlie', 20)
is before ('Baker', 20)
because there is a 20==20
tie on the key but ('Charlie', 20)
comes before ('Baker', 20)
in the original votes
dictionary).
The output then is:
[('Able', 10), ('Dog', 15), ('Charlie', 20), ('Baker', 20)]
I hope this makes it easier to understand.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With