Python guy - 1 month ago 10
Python Question

# Python counting multiple modes in a list

This is a simple function but it is giving me a hard time. I'm trying to calculate the mode in a list, and if there are > 1 modes (with the same frequency), then they need to be displayed.

``````def compute_mode(numbers):
mode = 0
count = 0
maxcount = 0
for number in numbers:
count = numbers.count(number)
if count >= maxcount:
maxcount = count
mode = number
print("Mode: ", mode, "Count: ", maxcount)
``````

Function call:

``````print(compute_mode([0,1,3,5,7,3,0]))
``````

Output:

``````Mode:  0 Count:  2
Mode:  3 Count:  2
Mode:  3 Count:  2
Mode:  0 Count:  2
``````

I can't seem to make the function not repeat the last two lines. I'm not sure why it is repeating again for 0 and 3.

Any ideas?

The reason you get the modes twice is that your for-loop loops over every element in the list. Therefore, when it encounters the second instance of a previously seen element, it prints it out again.

In other news, your function will fail for a different reason - try removing the first `0` and see what happens.

This is how I would fix it:

``````from collections import Counter

def compute_mode(numbers):
counts = Counter(numbers)
maxcount = max(counts.values())
for num,count in counts:
if count == maxcount:
print(num, count)
``````

If you want to do all the heavy lifting yourself:

``````def compute_mode(numbers):
counts = {}
maxcount = 0
for number in numbers:
if number not in counts:
counts[number] = 0
counts[number] += 1
if counts[number] > maxcount:
maxcount = counts[number]

for number, count in counts.items():
if count == maxcount:
print(number, count)
``````
Source (Stackoverflow)