Prev - #15 Median | Table of Contents | Next - #17 Dice Roll
Exercise #16: Modemode([1, 1, 2, 3, 4]) → 1
Mode is the third statistical calculation exercise in this book. The mode is the number that appears most frequently in a list of numbers. Together with the median and average, you can get a descriptive summary of a list of numbers. This exercise tests your ability to use a dictionary to keep a count of the numbers in a list to find the most frequent number.
Exercise Description
Write a mode()
function that has a numbers parameter. This function returns the mode, or most frequently appearing number, of the list of integer and floating-point numbers passed to the function.
These Python assert
statements stop the program if their condition is False
. Copy them to the bottom of your solution program. Your solution is correct if the following assert
statements’ conditions are all True:
assert mode([]) == None
assert mode([1, 2, 3, 4, 4]) == 4
assert mode([1, 1, 2, 3, 4]) == 1
import random
random.seed(42)
testData = [1, 2, 3, 4, 4]
for i in range(1000):
random.shuffle(testData)
assert mode(testData) == 4
Shuffling the order of the numbers should not affect the mode. The for
loop does 1,000 such random shuffles to thoroughly check that this fact remains true. For an explanation of the random.seed() function, see the Further Reading section of Exercise #19, “Password Generator”.
Try to write a solution based on the information in this description. If you still have trouble solving this exercise, read the Solution Design and Special Cases and Gotchas sections for additional hints.
Prerequisite concepts: for
loops, augmented assignment operators, indexes, not in
operator
Solution Design
The solution uses a dictionary to track how often each number appears in the list. The keys of the dictionary will be the number, and the values will be a count of how often the number appears in the list.
Start with an empty dictionary and set up two variables to keep track of the most frequent number and how many times this number has appeared in the list. Use a for
loop to loop over numbers in the numbers
list. If the current number we are looping on doesn’t appear in the dictionary’s keys, then create a key-value pair for it with the value starting at 0
. Then increment the count for this number in the dictionary. Finally, if this count is larger than the most frequent number’s count, update the most frequent number variable and most frequent number’s count variable with the current number and its count.
By the time the for
loop has finished, the most frequent number variable contains the mode of the numbers
list. Calculating the mode is similar Exercise #12, “Smallest & Biggest”. Both solutions loop over the list of numbers, using another variable to (in Exercise #12) keep track of the smallest/biggest number found so far or (in this exercise) keep track of the most frequently occurring number found so far.
Special Cases and Gotchas
If the numbers parameter is an empty list, the function should return None
. You should put the code that checks this at the start of the function.
Now try to write a solution based on the information in the previous sections. If you still have trouble solving this exercise, read the Solution Template section for additional hints.
Solution Template
Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/mode-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
def mode(numbers):
if len(numbers) == ____:
return ____
numberCount = {}
mostFreqNumber = None
mostFreqNumberCount = ____
for number in ____:
if ____ not in numberCount:
numberCount[____] = ____
numberCount[____] += ____
if numberCount[number] > ____:
mostFreqNumber = ____
mostFreqNumberCount = ____[____]
return mostFreqNumber
The complete solution for this exercise is given in Appendix A and https://invpy.com/mode.py. You can view each step of this program as it runs under a debugger at https://invpy.com/mode-debug/.
Prev - #15 Median | Table of Contents | Next - #17 Dice Roll
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4