A pencil and paper are great to have on hand for this type of problem, in terms of visualization.

**[** , , , , , , , , **]**

Which element or pair of elements is/are in the middle? What is its index?

```
sample = [ 41, 94, 38, 76, 59, 25, 19, 63, 81 ]
```

Count the number of elements.

```
n = len(sample)
```

Remember that the first element is index 0. Using integer (or floor) division, find the middle index (or upper pair index).

```
m = n // 2
```

In our visual above, what is the index of the middle element? What is `m`

when `n`

is floor divided by `2`

? `4`

?

Thanks to fellows like Martin Richards and Edsger W. Dijkstra

we have zero-indexing offering up another advantage in that the quotient of integer division (by 2) of the length of the list either gives us **the** middle index, or the **upper** of the two middle indices.

```
# s = sorted(sample)
return s[m] if n % 2 else (s[m - 1] + s[m]) / 2 # 59
```

*Note: divide by 2.0 if Python 2*

One key point to remember when looking for ways to simplify is to **identify and cache key data** so there are no recurrent patterns. An *identity* will fill in where needed. Note our `m`

and `n`

variables. There are no methods in the return statement.

I commented out the sort line because it is important for us to see (visualize) the middle element(s) of a list, whether sorted or not. Note that we cached the important data **before** sorting.

Consider also that the list we are computing the median of may be sensitive to changes. That’s why I use `sorted`

so the parameter is only copied, not mutated. That would re-order the original list and possibly cause problems somewhere else in the program. Lesson here is to never mutate a list in a function unless that is the specific intention. Finding the median of a list does not imply *that* intention. Best leave the argument list intact.