Exercise: Indexing lists 2

3.6.2.5. Exercise: Indexing lists 2#

You are happy with the function calculate_step_length you wrote in the previous exercise, but sometimes, you encountered an IndexError:

# y-coordinates of each heel strike, in meters
y = [0.13, 0.72, 1.29, 1.93, 2.55, 3.12, 3.71, 4.34, 4.95, 5.56]

calculate_step_length(y, 9)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[3], line 4
      1 # y-coordinates of each heel strike, in meters
      2 y = [0.13, 0.72, 1.29, 1.93, 2.55, 3.12, 3.71, 4.34, 4.95, 5.56]
----> 4 calculate_step_length(y, 9)

Cell In[2], line 2, in calculate_step_length(y, step)
      1 def calculate_step_length(y, step):
----> 2     return y[step + 1] - y[step]

IndexError: list index out of range

Question 1) Explain why this call produces an IndexError.

This happens because to calculate a step length, two consecutive heel strikes are needed. To calculate the length of step 9, heel strikes 9 and 10 are needed. However, the last element of y is at index 9.

One way to avoid this error is to check that the list will not be indexed out of its range, before calculating the step length.

Question 2) Modify your function so that instead of producing this error, it simply returns 0.

Good practice: Invalid data

For this example, we ask you to return 0 for invalid data, but a better practice would be to return np.nan, which will be seen in section Infinity and Not-A-Number (nan). Simply return 0 for now since we have not covered NumPy yet.

Hide code cell content
def calculate_step_length(y, step):
    """
    Calculate the step length of a given step.

    Parameters
    ----------
    y : list[float]
        A list of every heel strike's y coordinates for a given recording.
    step : int
        The index of the step we want to calculate, the first step being 0.

    Returns
    -------
    float
        The requested step length, or 0 if this step could not be calculated.
    """
    if step + 1 < len(y):
        return y[step + 1] - y[step]
    else:
        return 0.0


# Test it
print(calculate_step_length(y, 0))
print(calculate_step_length(y, 1))
print(calculate_step_length(y, 2))
print(calculate_step_length(y, 9))
0.59
0.5700000000000001
0.6399999999999999
0.0