Skip to content

Commit 5866902

Browse files
author
boraxpr
committed
bites 35 - heapq to get largest elements from a list of integers, a list of datetime objects and a list of dictionaries
1 parent d54abfc commit 5866902

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,5 @@
8181
/212/README.md
8282
/239/README.md
8383
/47/README.md
84+
/35/.cache/v/cache/lastfailed
85+
/35/README.md

35/test_top_n.py

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from datetime import datetime
2+
import inspect
3+
4+
from top_n import (numbers, dates, earnings_mln,
5+
get_largest_number, get_latest_dates,
6+
get_highest_earnings)
7+
8+
9+
def test_get_top_n():
10+
assert get_largest_number(numbers) == [6, 5, 4]
11+
assert get_largest_number(numbers, n=2) == [6, 5]
12+
assert get_largest_number(numbers, n=4) == [6, 5, 4, 3]
13+
14+
assert get_latest_dates(dates) == [datetime(2019, 2, 27, 0, 0),
15+
datetime(2018, 12, 19, 0, 0),
16+
datetime(2018, 11, 19, 0, 0)]
17+
assert get_latest_dates(dates, n=1) == [datetime(2019, 2, 27, 0, 0)]
18+
19+
assert get_highest_earnings(earnings_mln) == [{'name': 'Beyoncé Knowles',
20+
'earnings': 105},
21+
{'name': 'J.K. Rowling',
22+
'earnings': 95},
23+
{'name': 'Cristiano Ronaldo',
24+
'earnings': 93}]
25+
26+
27+
def test_heapq_used():
28+
err_msg = 'We want you to play with heapq for this one :)'
29+
assert 'heapq' in inspect.getsource(get_largest_number), err_msg
30+
assert 'heapq' in inspect.getsource(get_latest_dates), err_msg
31+
assert 'heapq' in inspect.getsource(get_highest_earnings), err_msg

35/top_n.py

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from datetime import datetime
2+
import heapq
3+
4+
numbers = [0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6]
5+
dates = [datetime(2018, 1, 23, 0, 0),
6+
datetime(2017, 12, 19, 0, 0),
7+
datetime(2017, 10, 15, 0, 0),
8+
datetime(2019, 2, 27, 0, 0),
9+
datetime(2017, 3, 29, 0, 0),
10+
datetime(2018, 8, 11, 0, 0),
11+
datetime(2018, 5, 3, 0, 0),
12+
datetime(2018, 12, 19, 0, 0),
13+
datetime(2018, 11, 19, 0, 0),
14+
datetime(2017, 7, 7, 0, 0)]
15+
# https://www.forbes.com/celebrities/list
16+
earnings_mln = [
17+
{'name': 'Kevin Durant', 'earnings': 60.6},
18+
{'name': 'Adele', 'earnings': 69},
19+
{'name': 'Lionel Messi', 'earnings': 80},
20+
{'name': 'J.K. Rowling', 'earnings': 95},
21+
{'name': 'Elton John', 'earnings': 60},
22+
{'name': 'Chris Rock', 'earnings': 57},
23+
{'name': 'Justin Bieber', 'earnings': 83.5},
24+
{'name': 'Cristiano Ronaldo', 'earnings': 93},
25+
{'name': 'Beyoncé Knowles', 'earnings': 105},
26+
{'name': 'Jackie Chan', 'earnings': 49},
27+
]
28+
29+
30+
def get_largest_number(numbers, n=3):
31+
return heapq.nlargest(n, numbers)
32+
33+
34+
def get_latest_dates(dates, n=3):
35+
return heapq.nlargest(n, dates)
36+
37+
38+
def get_highest_earnings(earnings_mln, n=3):
39+
return heapq.nlargest(n, earnings_mln, key=lambda x: x['earnings'])
40+

0 commit comments

Comments
 (0)