FAQ: Code Challenge: Loops - Max Num

This community-built FAQ covers the “Max Num” exercise from the lesson “Code Challenge: Loops”.

Paths and Courses
This exercise can be found in the following Codecademy content:

Computer Science

FAQs on the exercise Max Num

Join the Discussion. Help a fellow learner on their journey.

Ask or answer a question about this exercise by clicking reply (reply) below!

Agree with a comment or answer? Like (like) to up-vote the contribution!

Need broader help or resources? Head here.

Looking for motivation to keep learning? Join our wider discussions.

Learn more about how to use this guide.

Found a bug? Report it!

Have a question about your account or billing? Reach out to our customer support team!

None of the above? Find out where to ask other questions here!

Hi, why isn’t this a valid solution?

#Write your function here
def max_num(nums):
maximum = nums[0]
maximum = [num for num in nums if num > maximum]
maximum = maximum[0]
return maximum

#Uncomment the line below when your function is done
print(max_num([50, -10, 0, 75, 20]))

maximum = [num for num in nums if num > maximum]

I assume this might be the reason, if your num is smaller than the value previously assign to maximum, then your maximum value won’t keep updating.
you can validate by insert a number < 50 in the first place of the list(before 50), or change 0 in the list to 60, and you’ll get a result 60 instead of 75 it should be.

[1, 50, -10, 0, 75, 20] ==> result 50
[49, 50, -10, 0, 75, 20] ==> result 50
[50, -10, 60, 75, 20] ==> result 60

Ah ok I see where you’re coming from. Well in that case I passed the exercise by simply returning maximum[0], and shouldn’t have :sweat_smile:.

I don’t get why they put this in the loops section because I passed it without doing a loop and my code is way simpler than what a loop would be:

#define max_num
def max_num(nums):
#sort nums list
#return final variable/ largest number in nums list
return nums[-1]

Maybe I just cheated, but I felt like this answer would make more sense if this was an actual objective in the real world.

1 Like

At the very least, we should be able to take an unsorted list and parse out the minimum and maximum value using a simple algorithm, rather than built-in functions.

>>> from random import randint, shuffle
>>> u, v = randint(1, 1000), randint(1, 1000)
>>> if u > v:
	u, v = v, u

>>> y = list(range(u, v))
>>> shuffle(y)

Let’s pretend we don’t know the range that the list is created from and that this block of data was dropped in our lap.

>>> minimum, maximum = y[0], y[-1]
>>> for n in y:
	if n < minimum:
		minimum = n
	elif n > maximum:
		maximum = n

>>> minimum, maximum
(421, 921)

It’s a good observation that you can find min/max at the ends of a sorted list, however, the work carried out is more than is required.

Hi Kell215,

I used almost the same solution as you did it, but using sorted… not sure if these answers are the correct but I believe is better than use a loop…

def max_num(nums):
#Sorting list
l1 = sorted(nums)
return l1[-1]

Would sorting add to the workload, or take away from it?

>>> from random import randrange
>>> def maximize(a, b):
    return a > b and a or b

>>> sample = [randrange(1000000) for _ in range(1000000)]
>>> u = sample[0]
>>> for v in sample:
	u = maximize(u, v)

>>> u

As we would expect, the highest number may never be generated. In a subsequnet test we got,

>>> sample = [randrange(1000000) for _ in range(1000000)]
>>> u = sample[0]
>>> for v in sample:
	u = maximize(u, v)

>>> u

this is what i did

def max_num(nums):
return nums[-1]

is this the best solution?
if not, why.

When working with lists we must consider whether mutability is a possibility, or not. If not, then we cannot sort the list else it will be mutated from the original.

To preserve the original order of the list, while using your method,

return nums.copy().sort()[-1]

The copy will be only temporary, and the original will still be intact.

Sorting is a complex process, more so than iterating once through a list, so on the face of it, your solution would not be ‘the best’ where Big-O is concerned.

a = nums[0]
for x in nums[1:]:
    if x > a: a = x
return a

The best way i found of doing this without sorting the list and using a loop would be:

def max_num(nums):
  i = nums[0]
  for num in nums:  
    if i > num:
      i = num
  return i

(this is from my basic knowledge of python)

1 Like

could you please explain to me your code, I see that it is functioning, but why does it function I do not understand :slight_smile:
If possible could you please comment on each line of the text?

def max_num(nums):
  i = nums[0]  # i am defining the variable (i) as the first number in the list of num ( the element at index 0) 
  for num in nums:  # this means it will iterate through each element in nums
    if i > num:   # if (i) is greater than the element it will skip the element (i.e continue)
      i = num    # else if (i) is smaller than the element it will assign that number as i
  return i

so this code will iterate though each element in the list nums, it will then compare each element to the variable i which starts off as the first element in the list, if i is greater than the element it will skip that number using a continue statement, if the number is greater than i it will reassign i as that number, it will continue this loop untill all numbers have been checked, which will then return the final value of i.


I used this (very short) solution:

def max_num(nums):

worked right away :slight_smile:

The idea is to write a program to replace the max method, not use it directly. What would be the point of having our own function if we can just write,

max_num = max(nums)


Bottom line, don’t use built-ins when writing our own functions from scratch. What you have above teaches us nothing.

The sort() process takes up more time than the simple search to find a maximum, at least in the average and worst cases.

Besides, the point of these exercises is to find an algorithm to do the job, not a built in method or function.

Here’s my solution

def max_num(nums):
  var = [nums[0]]
  for num in nums:
    if num > var[0]:
      var[0] = num
  return var[0]


This is my solution:

How can I turn it into a list comprehension? (Perhaps it is for some reason not possible? / requires some knowledge I don’t have as a beginner…)
Any tips would be very welcome, as I seem to be stuck.

A comprehension will result in a list, not a value. We want the function to return a value. The method you have used is effective enough. It goes through the list once, then exits with the maximum.