5
\$\begingroup\$

Write the find_boundaries function, which will take a list of numbers. The function should return the tuple with the smallest and largest number in the set. If there is an item in the list that is not a number, it should be ignored. If an empty list is entered, the function should return None.

My code:

def find_boundaries(lista):

    if not lista:
        return None

    elif lista:
        max_ = lista[0]
        min_ = lista[0]
        new_lista = []


        for i in lista:
            if int == type(i):
                new_lista.append(i)

        for i in range(len(new_lista)):
            if new_lista[i] > max_:
                max_ = new_lista[i]

            elif new_lista[i] < min_:
                min_ = new_lista[i]


    return max_, min_

I am looking for any opinion/ suggestion on that code. It does what is expected, but would you say that this is the most efficient way to solve that task in Python?

\$\endgroup\$

1 Answer 1

6
\$\begingroup\$

welcome to Code Review!

I would write your code like this:

def find_boundaries(lista):
    if not lista:
        return None

    int_list = [x for x in lista if type(x) == int]
    return (max(int_list), min(int_list))

Notice a few things:

  • If you test your parameters for validity at the beginning of the function, it's perfectly fine not to use an else afterwards because the return statement exits the function (short-circuiting). This saves one level of nesting and makes the function more simple.

  • Python is designed to let you avoid writing loops as much as possible. Loops are a nuisance to write, take longer to read and increase cognitive load. You should get familiar with Python's list and dict comprehensions. Notice how much clearer the code for filtering out the values that aren't integers is.

  • Again, the max and min functions are built-in in Python and take any iterable (like a list) to return the largest and smallest element respectively. You don't need to deal with loop indices, the length of the list, etc. You just express what it is you want to return: a tuple that contains the largest and the smallest elements.

\$\endgroup\$
2
  • 3
    \$\begingroup\$ Non-numbers should be filtered out before checking for emptiness \$\endgroup\$
    – belkka
    Commented Jan 27, 2019 at 17:55
  • 2
    \$\begingroup\$ I would suggest using isintance(x, int) in the list comprehension. \$\endgroup\$
    – Alex
    Commented Jan 27, 2019 at 19:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.