46

I'm finding max value and min value of a list by using max(list) and min(list) in Python. However, I wonder how to manage empty lists.

For example if the list is an empty list [], the program raises 'ValueError: min() arg is an empty sequence' but I would like to know how to make the program just print 'empty list or invalid input' instead of just crashing. How to manage those errors?

3 Answers 3

102

In Python 3.4, a default keyword argument has been added to the min and max functions. This allows a value of your choosing to be returned if the functions are used on an empty list (or another iterable object). For example:

>>> min([], default='no elements')
'no elements'

>>> max((), default=999)
999

>>> max([1, 7, 3], default=999) # 999 is not returned unless iterable is empty
7

If the default keyword is not given, a ValueError is raised instead.

Sign up to request clarification or add additional context in comments.

Comments

52

Specifying a default in earlier versions of Python:

max(lst or [0])
max(lst or ['empty list'])

2 Comments

Very nice. For the curious, this works because empty lists are falsy in Python... so [1,2,3] or 'something else' is [1,2,3], but [] or 'something else' is 'something else'. If the latter is a one-item list, min() will always return its only item.
Unfortunately this doesn't work for empty iterators.
16

Catch and handle the exception.

try:
    print(min(l), max(l))
except (ValueError, TypeError):
    print('empty list or invalid input')

ValueError is raised with an empty sequence. TypeError is raised when the sequence contains unorderable types.

2 Comments

this is prefered way to do this in python (exceptions are cheap): docs.python.org/3/glossary.html#term-eafp
There's a side-effect: if some other error occurs lower on the stack that happens to be of the same type, it'll be caught too. This inaccuracy is the primary source of critique for exception handling. In this particular case, this is probably of little concern though.

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.