Python Basics: Looping over common Data Structures
Python Basics: Looping over common Data Structures
Looping is an essential aspect to programming. Given a data structure which length may vary, it is common to want to repeat an operation over each elements of it. Instead of repeating the common operation in your code, you can use looping to iterate over all elements in a data structure.
I will give a few examples of how to loop over the common data structures in Python (string
, list
, tuple
& dictionary
).
This will cover for
loops and not while
loops.
The name of the variable(s) inside the loop is for you to define, but keep it mind that you should try to use variable names which makes sense and make your code readable.
Looping over a string
Simple looping over characters
sentence = "How to loop over a string?"
for character in sentence:
# here you can do any operation which will be repeated
# for each character in the sentence.
print(character)
Looping over characters and positions
We can access the characters of a string
in Python using their index or position.
For example if s = "Baz"
, then s[0] == 'B'
, s[1] == 'a'
and s[2] == 'z'
.
You can notice that index starts from 0
for the first element in Python.
This is the same for string
, list
and tuple
.
sentence = "How to loop over a string with the position?"
for position, character in enumerate(sentence):
# here you can do any operation which will be repeated
# for each position and character in the sentence
# using the "enumerate" function.
print(position, character)
Looping over a list
Simple looping over elements
grades = [11, 18, 16, 19, 14]
for grade in grades:
# here you can do any operation which will be repeated
# for each grade in the grades list.
print(grade)
Looping over elements and positions
We can access the elements of a list
in Python using their index or position.
For example if l = [2, 0, 1]
, then l[0] == 2
, l[1] == 0
and l[2] == 1
.
grades = [11, 18, 16, 19, 14]
for position, grade in enumerate(grades):
# here you can do any operation which will be repeated
# for each position and grade in the grades list
# using the "enumerate" function.
print(position, grade)
Looping over a tuple
A tuple
is an immutable container of elements, which means we can not change/add/remove elements after it is defined.
Looping over a tuple
is the same as looping over a list
.
Simple looping over elements
names = ("Jane", "John", "Janet")
for name in names:
# here you can do any operation which will be repeated
# for each name in the names tuple.
print(name)
Looping over elements and positions
We can access the elements of a tuple
in Python using their index or position.
For example if t = (1, 2)
, then t[0] == 1
and t[1] == 2
.
names = ("Jane", "John", "Janet")
for position, name in enumerate(names):
# here you can do any operation which will be repeated
# for each position and name in the names list
# using the "enumerate" function.
print(position, name)
Looping over a dictionary
A dictionary
is a container of “key/value” pairs, in other words a mapping of elements.
We can access the elements of a dictionary
in Python using the keys.
For example if d = {"foo": 1, "bar": 2}
, then d["foo"] == 1
and d["bar"] == 2
.
Simple looping over keys
A simple loop over a dictionary
iterates over the keys of the dictionary
.
ages = {"Jane": 25, "John": 26, "Janet": 24}
for name in ages:
# here you can do any operation which will be repeated
# for each name (key) in the ages dictionary.
# you can access the value with the key:
age = ages[name]
print(name, age)
Looping over key/value pairs
The items
method of the dictionary will return all the key/value pairs.
This way, you can iterate over key/value pairs directly.
ages = {"Jane": 25, "John": 26, "Janet": 24}
for name, age in ages.items():
# here you can do any operation which will be repeated
# for each name (key) and age (value) in the ages dictionary.
print(name, age)
Looping over values
The values
method of the dictionary will return all values in a list
.
This way, you can iterate over key/value pairs directly.
ages = {"Jane": 25, "John": 26, "Janet": 24}
for age in ages.values():
# here you can do any operation which will be repeated
# for each age (value) in the ages dictionary.
print(age)
Looping in practice
Use case 1: sum of a list
Given a list
of grades, of unknown/varying size, we can compute the sum using looping:
grades = [11, 18, 16, 19, 14]
# initialize sum of grades to 0
sum_of_grades = 0
for grade in grades:
# add current grade to the total sum
sum_of_grades = sum_of_grades + grade
# check result is correct:
assert 78 == sum_of_grades
Use case 2: average of a list
This is the same as above, we just need to divide the sum by the length of the list
and round to 2
decimal point.
grades = [11, 18, 16, 19, 14]
# initialize sum of grades to 0
sum_of_grades = 0
for grade in grades:
# add current grade to the total sum
sum_of_grades = sum_of_grades + grade
avg_of_grades = round(sum_of_grades / len(grades), 2)
# check result is correct:
assert 15.6 == avg_of_grades
Use case 3: dictionary of grades
Given a dictionary
with names as key and a list
of grades as values of unknown/varying size, we can compute the average for each student using looping:
grades_dict = {"Jane": [14, 16], "John": [11, 12], "Janet": [18, 16]}
# initialize result to an empty dictionary:
avg_of_grades_dict = {}
for name, grades in grades_dict.items():
# do the same as above inside the loop for each student:
sum_of_grades = 0
for grade in grades:
# add current grade to the total sum
sum_of_grades = sum_of_grades + grade
# compute the average for the student:
avg_of_grades = round(sum_of_grades / len(grades), 2)
# save the avg in a result dictionary for the student:
avg_of_grades_dict[name] = avg_of_grades
# check result is correct:
assert {"Jane": 15.0, "John": 11.5, "Janet": 17.0} == avg_of_grades_dict
Use case 4: common letters (in place) in a string
Given two words (of type string
), we can find the common letters in the same position using looping:
name = "Jean"
surname = "John"
# initialize result to an empty list:
common_letters_in_place = []
# loop over position and letters in a string with enumerate:
for position, letter in enumerate(name):
# check if letters in both string are the same at the same position:
if letter == surname[position]:
common_letters_in_place.append(letter)
# check result is correct:
assert ['J', 'n'] == common_letters_in_place
Code
All the code from this blog post can be found in this replit.