By Zed A. Shaw

LPTHW: Ordinal, and Cardinal Numbers

Here's how I'm teaching indexing into lists in LPTHW and I'm wondering what people think. The basic idea is if they know the difference between an ordinal and cardinal number then they can more easily figure out how to translate them in their head. Let me know if you have other ideas.

Exercise 34: Accessing Elements Of Lists

Lists are pretty useful, but unless you can get at the things in them they aren't all that good. You can already go through the elements of a list in order, but what if you want say, the 5th element? You need to know how to access the elements of a list. Here's how you would access the first element of a list:

animals = ['bear', 'tiger', 'penguin', 'zeebra'] bear = animals[0]

You take a list of animals, and then you get the first one using 0?! How does that work? Well, because of the way math works, Python start its lists at 0 rather than 1. It seems weird, but there's many advantages to this, even though it is actually mostly arbitrary.

The best way to explain why is by showing you the difference between how you use numbers and how programmers have to use numbers with a little example using the animals above.

Imagine you're watching the four animals in our list above (['bear', 'tiger', 'penguin', 'zeebra']) run in a race. Now they win in the order we have them in this list. The race was really exciting because, well the animals didn't kill eachother and somehow managed to run a race. Your friend however shows up late and wants to know who won. Does your friend say, "Hey, who came in zeroth?" No, he says, "Hey says, hey who came in first?"

This is because the order of the animals is important. You can't have the second animal without the first animal, and can't have the third without the second. It's also impossible to have a "zeroth" animal since zero means nothing. How can you have a nothing win a race? It just doesn't make sense. We call these kinds of numbers "ordinal" numbers, because they indicate an ordering of things.

Now, programmers however can't think this way because they can pick any element out of a list at any point. To a programmer, the above list is more like a deck of cards. If they want the tiger, they grab it. If they want the zeebra, they can take it too. This need to pull elements out of lists at random means that they need a way to indicate elements consistently by an address, an "index", and the best way to do that is to start the indices at 0. Trust me on this, the math is way easier for these kinds of accesses. In fact, this kind of number is a "cardinal" number and means you can pick at random, so there needs to be a 0 element.

Alright, how does this help you work with lists? Simple, every time you say to yourself, "I want the 3rd animal," you translate this "ordinal" number to a "cardinal" number by subtracting 1. The "3rd" animal is at index 2 and is the penguin. You have to do this because you've spent your whole life using ordinal numbers, and now you have to think in cardinal. Just subtract 1 and you'll be good.

Remember: ordinal == ordered, 1st; cardinal == cards at random, 0.

Let's practice this. I've given you a list of animals, and then exercises where I tell you to write down what animal you get for that ordinal or cardinal number. Remember if I say "first", "second", etc. then I'm using ordinal, so subtract 1. If I give you cardinal (0, 1, 2) then use it directly.

animals = ['bear', 'python', 'peacock', 'kangaroo', 'whale', 'platypus']

  1. The animal at 1.
  2. The 3rd animal.
  3. The 1st animal.
  4. The animal at 3.
  5. The 5th animal.
  6. The animal at 2.
  7. The 6th animal.
  8. The animal at 4.

For each of these, write out a full sentence of the form: "The 1st animal is at 0 and is a bear." Then say it backwards, "The animal at 0 is the 1st animal and is a bear."

Use your python to check your answers.

Extra Credit

  1. Read about ordinal and cardinal numbers online.
  2. With what you know of the difference between these types of numbers, can you explain why this really is 2010? (Hint, you can't pick years at random.)
  3. Write some more lists and work out similar indexes until you can translate them.
  4. Use Python to check your answers to this as well.