'How to sort with lambda in Python
In Python, I am trying to sort by date with lambda. I can't understand my error message. The message is:
<lambda>() takes exactly 1 argument (2 given)
The line I have is
a = sorted(a, lambda x: x.modified, reverse=True)
Solution 1:[1]
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)
It will print as following:
[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Solution 2:[2]
You're trying to use key functions with lambda functions.
Python and other languages like C# or F# use lambda functions.
Also, when it comes to key functions and according to the documentation
Both list.sort() and sorted() have a key parameter to specify a function to be called on each list element prior to making comparisons.
...
The value of the key parameter should be a function 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.
So, key functions have a parameter key and it can indeed receive a lambda function.
In Real Python there's a nice example of its usage. Let's say you have the following list
ids = ['id1', 'id100', 'id2', 'id22', 'id3', 'id30']
and want to sort through its "integers". Then, you'd do something like
sorted_ids = sorted(ids, key=lambda x: int(x[2:])) # Integer sort
and printing it would give
['id1', 'id2', 'id3', 'id22', 'id30', 'id100']
In your particular case, you're only missing to write key= before lambda. So, you'd want to use the following
a = sorted(a, key=lambda x: x.modified, reverse=True)
Solution 3:[3]
In Python3:
from functools import cmp_to_key
def compare(i1,i2):
return i1-i2
events.sort(key=cmp_to_key(compare))
Solution 4:[4]
Take a look at this Example, you will understand:
Example 1:
a = input()
a = sorted(a, key = lambda x:(len(x),x))
print(a)
input: ["tim", "bob", "anna", "steve", "john","aaaa"]
output: ['bob', 'tim', 'aaaa', 'anna', 'john', 'steve']
input: ["tim", "bob", "anna", "steve", "john","aaaaa"]
output: ['bob', 'tim', 'anna', 'john', 'aaaaa', 'steve']
Example 2 (advanced):
a = ["tim", "bob", "anna", "steve", "john","aaaaa","zzza"]
a = sorted(a, key = lambda x:(x[-1],len(x),x))
print(a)
output: ['anna', 'zzza', 'aaaaa', 'bob', 'steve', 'tim', 'john']
Conclusion:
key = lambda x:(p1,p2,p3,p4,...,pn),x is one element at a time from the stream of input.p1,p2,p3...pn being properties based on which the stream of elements needs to be sorted.
based on priority order of p1>p2>p3>...>pn.
We can also add reverse=True, after the sorting condition, to sort the elements in reverse order.
Solution 5:[5]
Except for other complete answers, I know a great page for you to dive into.
You may find why there are key and cmp between python2.x and python3.
Solution 6:[6]
Another excellent example of a sorted function with lambda on Python3;
# list of sport teams with wins and losses
sportTeams = [("Royals", (18, 12)), ("Rockets", (24, 6)),
("Cardinals", (20, 10)), ("Dragons", (22, 8)),
("Kings", (15, 15)), ("Chargers", (20, 10)),
("Jets", (16, 14)), ("Warriors", (25, 5))]
# sort the teams by number of wins
sortedTeams = sorted(sportTeams, key=lambda t: t[1][0], reverse=True)
print(sortedTeams)
Output:
[('Warriors', (25, 5)), ('Rockets', (24, 6)), ('Dragons', (22, 8)), ('Cardinals', (20, 10)), ('Chargers', (20, 10)), ('Royals', (18, 12)), ('Jets', (16, 14)), ('Kings', (15, 15))]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Book Of Zeus |
| Solution 2 | |
| Solution 3 | James L. |
| Solution 4 | Alessio Cantarella |
| Solution 5 | Chengcheng Xu |
| Solution 6 | smeric |
