Lists: many values, one name
A variable holds one thing. A list holds many, in order, under a single name.
Making a list
Square brackets, values separated by commas:
scores = [10, 8, 9, 7]
names = ["Ayesha", "Bilal", "Chen"]
print(scores)
print(names)
print(len(names))
[10, 8, 9, 7] ['Ayesha', 'Bilal', 'Chen'] 3
len() — the same function you met with strings — gives the number of items.
Getting one item out
Square brackets again, with a position:
names = ["Ayesha", "Bilal", "Chen"]
print(names[0])
print(names[1])
print(names[2])
Ayesha Bilal Chen
Positions start at zero. The first item is names[0], not names[1].
This feels wrong to everyone at first and is the single most common source of list bugs. A useful way to think about it: the number is not "which item" but "how far along from the start". The first item is zero steps from the start.
So the last item of a three-item list is at position 2, not 3:
names = ["Ayesha", "Bilal", "Chen"]
print(names[2])
print(names[-1])
Chen Chen
-1 means "the last one" — much safer than counting, because it stays correct
when the list changes size.
Ask for a position that does not exist and Python stops with an error:
names = ["Ayesha", "Bilal", "Chen"]
print(names[3])
Read the message: list index out of range. It means exactly what it says, and it is almost always an off-by-one.
Changing a list
Unlike strings, lists can be changed in place:
scores = [10, 8, 9]
scores[1] = 100 # replace an item
scores.append(7) # add to the end
scores.remove(10) # remove by value
print(scores)
[100, 9, 7]
Compare this with the strings lesson, where name.upper() gave back a new
string and left the original alone. scores.append(7) changes scores itself
and returns nothing. That difference matters:
scores = [1, 2]
result = scores.append(3)
print(scores)
print(result)
[1, 2, 3] None
None is Python's word for "no value at all". If you ever print a list and get
None, you have almost certainly written scores = scores.append(3) — storing
the nothing that append handed back, and destroying your list in the process.
Looping over a list
This is where lists and loops meet, and it is the most useful thing in this lesson:
names = ["Ayesha", "Bilal", "Chen"]
for name in names:
print(f"Hello, {name}!")
Hello, Ayesha! Hello, Bilal! Hello, Chen!
No range(), no positions, no counting. Python walks the list and hands you one
item at a time. This is almost always what you want.
Totals and averages
The building-up pattern from the loops lesson, now on real data:
scores = [10, 8, 9, 7, 6]
total = 0
for score in scores:
total += score
print(f"Total: {total}")
print(f"Average: {total / len(scores)}")
Total: 40 Average: 8.0
Python can do the total for you, and for anything real you should let it:
scores = [10, 8, 9, 7, 6]
print(sum(scores))
print(max(scores))
print(min(scores))
print(sorted(scores))
40 10 6 [6, 7, 8, 9, 10]
Writing the loop yourself first is worth doing once, so you know what sum()
is actually doing. After that, use sum().
Checking whether something is in a list
names = ["Ayesha", "Bilal", "Chen"]
if "Bilal" in names:
print("Bilal is here")
if "Dana" not in names:
print("Dana is not")
Bilal is here Dana is not
in reads exactly like English and saves you writing a loop to search.
Your turn
The list towns is already set up. Print the FIRST town, then the LAST town, each on its own line. Work the last one out from the list rather than counting by hand.
Add "Chen" to the end of the list students, then print the whole list on one line.
scores holds five marks. Print the highest mark, then the average on the next line. The average should print as 74.0.
Print only the marks that are 60 or above, each on its own line, keeping the original order. Then print how many there were.
Prefer learning with a teacher?
WasiLearn Academy runs small-group classes covering this material, online and in Karachi.
See the classes