Iterables: list, dict, tuple, and set
Iterables are list-like objects that contain other objects. These kinds of objects are used heavily in Python, so let's learn how to work with them!
In this chapter, you will learn
- What an iterable object is
- What indexing is
- What slicing is
- About the built-in iterable types: list, dict, tuple, and set
- How to work with the built-in iterables
Test yourself
- Eight interactive mini exercises
- Two review exercises
Iterables, order, and mutability
In Python, an iterable object (or simply an iterable) is a collection of elements that you can loop (or iterate) through one element at a time. Simply put, an iterable is a list-like (or array-like) object. There are many kinds of iterables, which differ in many ways, including whether they are ordered and mutable:
- An iterable is ordered if you can retrieve its elements in a predictable order
- An iterable is mutable if you can change which elements it contains
Python has four built-in iterable types: list
, dict
, tuple
, and set
list: an ordered, mutable collection of elements
A list
consists of zero or more other elements in a fixed order. The elements of a list
can be anything, such a numbers (int
), strings (str
), and even other list
s. Different elements from the same list
can have different types.
A list
is defined as a comma-separated list of values between square brackets:
prime_numbers = [1, 3, 5, 7, 11]
print(prime_numbers)
empty_list = []
print(empty_list)
Output:
[1, 3, 5, 7, 11]
[]
Mini exercise
Print a list
that contains the first three letters of the alphabet as three separate elements.
Getting a single element (indexing)
To get a single element from a list
, use the index (position) of the element, where 0
is the first element, 1
is the second element, etc. That is, Python uses zero-based indexing. You can also count from the end of the list
by using a negative index, where -1
is the last element, -2
, is the second-to-last element, etc.
print('First prime number:')
print(prime_numbers[0])
print('Last prime number (of our list):')
print(prime_numbers[-1])
Output:
First prime number:
1
Last prime number (of our list):
11
Mini exercise
Create a list
that contains the first five prime numbers. Print out the second number from this list.
Getting a range of elements (slicing)
You can also get multiple elements from a list
by specifying a slice.
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
from_index = 0
to_index = 4 # Non-inclusive, so until and including 'd' (at index 3)
in_steps_of = 3
print(letters[from_index:to_index:in_steps_of])
Output:
['a', 'd']
All the parts of a slice are optional, and fall back to the start of the list (for from_index
), the end of the list (for to_index
), and steps of 1. So you can get the first two prime numbers by only specifying the to_index
, like this:
print(prime_numbers[:2])
Output:
[1, 3]
A common way to create a copy of a list to get the full slice. (This is equivalent to list.copy()
in Python 3.)
my_copy = prime_numbers[:]
Mini exercise
Again create a list
that contains the first five prime numbers. Print out a slice that contains all numbers from this list
except for the first and the last one.
len(): counting the number of elements
len()
counts how many elements there are in a list
, or more generally in any iterable that has a length. (Some special iterables have no length, for example because they correspond to an infinite series. However, all iterables that we consider here have a length.)
n = len(prime_numbers)
print('We have defined {0} prime numbers'.format(n))
Output:
We have defined 5 prime numbers
in: checking whether an iterable contains an element
Python has a special operator, in
, to check whether an element is part of a list
or another iterable.
if 3 in prime_numbers:
print('Three is prime')
Output:
Three is prime
Mini exercise
Again create a list
with the first five prime numbers. Ask the user for input. Convert this input to int
, and check whether the resulting number is in our list of prime numbers. If it is, print out 'The number is prime', else print out 'The number is not among the first five prime numbers'. When running the code, enter one of the first five prime numbers to solve the exercise.
Modifying a list
A list
has several common functions for adding or removing elements:
list.append(element)
adds an element to the endlist.insert(index, element)
inserts an element at positionindex
element = list.pop()
removes the last element from the list and returns it. You can also specify an index of an element, in which case this element is removed and returned (instead of the last element).
prime_numbers = []
prime_numbers.append(1)
prime_numbers.append(3) # Etc.
print(prime_numbers)
Output:
[1, 3]
For an overview of list
functions, see:
Mini exercise
Again create a list
with the first five prime numbers. Remove the third number from the list, using either pop()
or remove()
. Print out the resulting list
.
dict: an unordered, mutable collection of key-value pairs
A dict
consists of zero or more key-value pairs. That is, each element of a dict
is a combination of a value that serves as a key and that is associated with another value. A dict
is unordered, which means that if you iterate through the elements of a dict
, you are not guaranteed to get the elements in a particular order. So never rely on the order of a dict
!
A dict
supports len()
and in
, as described above for list
s. However, indexing a dict
works differently from a list
, as discussed below, and slicing is not supported.
A dict
is defined as a comma-separated list of key : value mappings between curly braces.
ages = {
'Jay-Z': 52, # and counting
'Emanuel Macron': 44 # and counting
}
print(ages)
Output:
{'Jay-Z': 52, 'Emanuel Macron': 44}
Getting a single element (indexing)
If you want to get an elements from a dict
, you do this by specifying a key
.
age_jayz = ages['Jay-Z']
print(f'Jay-Z is {age_jayz} years old')
Output:
Jay-Z is 52 years old
Alternatively, you can use dict.get()
, which allows you to specify a default value in case the key is not in the dict
.
age_depp = ages.get('Johnny Depp', 'unknown')
print(f'Johnny Depp is {age_depp} years old')
Output:
Johnny Depp is unknown years old
Mini exercise
Define a dict
of the three largest cities in the world, where keys are names and values are population numbers in millions of inhabitants (e.g. 37 for Tokyo). Next, ask the user to enter the name of a city. If the city name is part of the dict
, print out the population in the following format: 'The population of X is Y million inhabitants'. If the city name is not part of the dict
, fall back to using 'unknown' for the population value.
When running the code, enter 'Tokyo' to solve the exercise.
tuple: an ordered, immutable collection of elements
The tuple
is very similar to a list
. The main difference between the two types is that a tuple
is immutable, which means that a tuple
cannot be changed after it has been defined; in other words, there are no functions such as tuple.append()
, tuple.pop()
, etc. However, you can concatenate two tuple
s using the +
operator, in which case you get a new tuple
that contains the elements of both of the concatenated tuple
s.
A tuple
supports indexing, slicing, len()
and in
, as described above for list
s.
A tuple
is defined as a comma-separated list of values, optionally surrounded by parentheses.
fibonacci = 1, 1, 2, 3, 5
# Parentheses are optional unless they are required to avoid ambiguity
fibonacci = (1, 1, 2, 3, 5)
Mini exercise
Create one tuple
that contains the first five numbers of the fibonacci series. Create another tuple
that contains the first five prime numbers. Concatenate the two tuple
s and print out the result.
set: an unordered, mutable collection of unique elements
The set
is a somewhat unusual type, which you will rarely use unless you're doing mathematical computations. A set
corresponds to a mathematical set as specified in set theory.
A set
supports len()
and in
, as described above for list
s. However, a set
does not support indexing or slicing.
A set
is defined as a comma-separated list of values surrounded by curly braces.
vowels = {'a', 'e', 'i', 'o', 'u'}
A characteristic feature of set
s is that each element can occur at most once (duplicates are ignored):
print({'a', 'e'} == {'a', 'a', 'e', 'e'})
Output:
True
The set
also supports standard operations from set theory:
- The union (
|
) of two sets contains all elements that occur in either or both of the sets - The intersection (
&
) of two sets contains all elements that occur in both sets
vowels_1 = {'a', 'e', 'i'}
vowels_2 = {'i', 'o', 'u'}
print('Union: {0}'.format(vowels_1 | vowels_2))
print('Intersection: {0}'.format(vowels_1 & vowels_2))
Output:
Union: {'i', 'e', 'a', 'u', 'o'}
Intersection: {'i'}
For more information, see:
Mini exercise
Create one set
that contains the first five numbers of the fibonacci series. Create another set
that contains the first five prime numbers. Print out all numbers that occur in both sets (i.e. the intersection).
Review exercises
Fibonacci
Define a fibonacci
list
that corresponds to the Fibonacci series up to 8. Then, use slicing to create two subseries:
even_fibonacci
, with all numbers at even indices (0, 2, etc.); andodd_fibonacci
, with all numbers at odd indices (1, 3, etc.).
This exercise is not checked automatically, because there are several possible solutions. Click here to see one solution!
Best-selling artists
Define an artists
dict
with the names of the four best-selling music artists as keys, and their claimed sales as values:
- The Beatles with 600 million sales
- Elvis Presley with 600 million sales
- Michael Jackson with 350 million sales
- Madonna with 300 million sales
Then ask the user to enter the name of an artist. Look up the number of sales of this artist, falling back to 'unknown' if the artists is not in the dict
, and print out the result.
This exercise is not checked automatically, because there are several possible solutions. Click here to see one solution!
You're done with this section!
Continue with Loops >>