Skip to main content

How to Solve "IndexError: list index out of range" Exception in Python

The IndexError in Python is a common exception raised when you try to access a sequence (like a list, tuple, or string) using an index that is outside the valid range of indices for that sequence.

This guide explains the different situations where IndexError can occur, and provides clear solutions and best practices for avoiding and handling them. We'll cover list assignment, CSV file reading, accessing command-line arguments with sys.argv, and using the pop() method.

IndexError: list assignment index out of range

This error occurs when you try to assign a value to a list index that doesn't exist. Lists in Python are dynamic, but you can't assign to an index beyond the current end of the list.

my_list = ['a', 'b', 'c']

try:
my_list[3] = 'd' # ⛔️ IndexError: list assignment index out of range
except IndexError as e:
print(e) # list assignment index out of range
  • The maximum index in a list is always len(list) -1.

Solutions:

  • Using append(): To add an element to the end of the list, use append():

    my_list = ['a', 'b', 'c']
    my_list.append('d')
    my_list.append('e')
    print(my_list) # Output: ['a', 'b', 'c', 'd', 'e']
  • Pre-allocating List Size: If you know the final size of the list in advance, you can initialize it with a default value (e.g., None) and then assign to specific indices:

    my_list = [None] * 5  # Creates a list with 5 None elements
    print(my_list) # Output: [None, None, None, None, None]
    my_list[4] = 'hello'
    print(my_list) # Output: [None, None, None, None, 'hello']
  • Using try-except: Use a try-except block to catch the IndexError and handle it gracefully:

    my_list = ['a', 'b', 'c']
    try:
    my_list[3] = 'd' # This will raise an IndexError
    except IndexError:
    print('The specified assignment index does NOT exist')
  • Checking List Length: Validate the index against the list's length before attempting assignment:

    my_list = ['a', 'b', 'c']
    idx = 3

    if len(my_list) > idx:
    my_list[idx] = 'Z'
    print(my_list)
    else:
    print(f'index {idx} is out of range') # Output: index 3 is out of range

(CSV) IndexError: list index out of range

This error commonly occurs when working with CSV files, particularly if some rows have fewer columns than expected.

import csv

with open('employees.csv', newline='', encoding='utf-8') as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')

for row in csv_reader:
try:
print(row[0]) # IndexError might occur here
except IndexError as e:
print("Error", e)

Solutions:

  • Checking Row Length: Before accessing elements by index, check the length of the row:

    import csv

    with open('employees.csv', newline='', encoding='utf-8') as csvfile:
    csv_reader = csv.reader(csvfile, delimiter=',')

    for row in csv_reader:
    if row: # Check if row is not empty
    print(row[0])

    # Alternatively:
    with open('employees.csv', newline='', encoding='utf-8') as csvfile:
    csv_reader = csv.reader(csvfile, delimiter=',')
    idx = 1
    for row in csv_reader:
    if len(row) > idx:
    print(row[idx])
  • Using try-except: Catch the IndexError within the loop:

    import csv

    with open('employees.csv', newline='', encoding='utf-8') as csvfile:
    csv_reader = csv.reader(csvfile, delimiter=',')
    for row in csv_reader:
    try:
    print(row[1])
    except IndexError:
    print('except block ran') # handles error and continues with the rest
    continue

sys.argv[1] IndexError: list index out of range**

This error happens when you try to access command-line arguments that weren't provided when the script was run. sys.argv is a list of strings, where sys.argv[0] is the script name, sys.argv[1] is the first argument, and so on.

import sys

print(sys.argv) # ['main.py'] (if no arguments are provided)
try:
print(sys.argv[1]) # IndexError if no argument is passed
except IndexError as e:
print("Error:", e)

Solutions:

  • Providing Required Arguments: Run your script with the necessary arguments:

    python main.py first_arg second_arg
  • Checking sys.argv Length: Check the length of sys.argv before accessing elements:

    import sys

    print(sys.argv)
    idx = 1

    if len(sys.argv) > idx:
    print(sys.argv[idx]) # Access only if it exists
    else:
    print(f'index {idx} out of range')
  • Using a try-except Block:

    import sys

    print(sys.argv) # Output: ['main.py']
    try:
    print(sys.argv[1]) # Output: list index out of range
    except IndexError:
    print('index out of range') # This will execute if index out of range.

IndexError: pop index out of range

This occurs when you call the pop() method with an index that is outside the valid range of list indices.

my_list = ['a', 'b', 'c']

try:
result = my_list.pop(3) # IndexError: pop index out of range
except IndexError as e:
print(e) # pop index out of range

Solutions:

  • Popping from the End: If you want to remove the last element, call pop() without any index:

    my_list = ['a', 'b', 'c']
    result = my_list.pop()
    print(result) # Output: c
    print(my_list) # Output: ['a', 'b']
  • You can also use negative values, to access and remove items starting from the end of the list.

  • Checking List Length Before pop(): Always check the list's length before calling pop() with a specific index:

    my_list = ['a', 'b', 'c']
    idx = 3
    if len(my_list) > idx: # Checking that the list is long enough
    result = my_list.pop(idx)
    print(result)
    else:
    print(f'index {idx} is out of range')
  • Using try-except: Wrap the pop() call in a try-except block:

    my_list = ['a', 'b', 'c']
    idx = 3

    try:
    result = my_list.pop(idx)
    except IndexError:
    print(f'index {idx} is out of range')

Conclusion

The IndexError in Python is a signal that you're trying to access a sequence element using an invalid index.

This guide explained several scenarios where this error occurs, including list assignment, CSV reading, sys.argv, and the pop() method.

By consistently checking list lengths, using try-except blocks, and understanding how indexing works, you can write robust code that avoids this common error.

The key is to always ensure the index you're using is within the valid bounds of the sequence.