Python Engineer

Free Python and Machine Learning Tutorials

Become A Patron and get exclusive content! Get access to ML From Scratch notebooks, join a private Slack channel, get priority response, and more! I really appreciate the support!

back to course overview

Tuples - Advanced Python 02

21 Apr 2019

A tuple is a collection of objects which is ordered and immutable. Tuples are similar to lists, the main difference ist the immutability. In Python tuples are written with round brackets and comma separated values.

my_tuple = ("Max", 28, "New York")

Reasons to use a tuple over a list

Create a tuple

Tuples are created with round brackets and comma separated values. Or use the built-in tuple function.

tuple_1 = ("Max", 28, "New York") tuple_2 = "Linda", 25, "Miami" # Parentheses are optional # Special case: a tuple with only one element needs to have a comma at the end, # otherwise it is not recognized as tuple tuple_3 = (25,) print(tuple_1) print(tuple_2) print(tuple_3) # Or convert an iterable (list, dict, string) with the built-in tuple function tuple_4 = tuple([1,2,3]) print(tuple_4)
('Max', 28, 'New York') ('Linda', 25, 'Miami') (25,) (1, 2, 3)

Access elements

You access the tuple items by referring to the index number. Note that the indices start at 0.

item = tuple_1[0] print(item) # You can also use negative indexing, e.g -1 refers to the last item, # -2 to the second last item, and so on item = tuple_1[-1] print(item)
Max New York

Add or change items

Not possible and will raise a TypeError.

tuple_1[2] = "Boston"
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-c391d8981369> in <module> ----> 1 tuple_1[2] = "Boston" TypeError: 'tuple' object does not support item assignment

Delete a tuple

del tuple_2

Iterating

# Iterating over a tuple by using a for in loop for i in tuple_1: print(i)
Max 28 New York

Check if an item exists

if "New York" in tuple_1: print("yes") else: print("no")
yes

Usefule methods

my_tuple = ('a','p','p','l','e',) # len() : get the number of elements in a tuple print(len(my_tuple)) # count(x) : Return the number of items that is equal to x print(my_tuple.count('p')) # index(x) : Return index of first item that is equal to x print(my_tuple.index('l')) # repetition my_tuple = ('a', 'b') * 5 print(my_tuple) # concatenation my_tuple = (1,2,3) + (4,5,6) print(my_tuple) # convert list to a tuple and vice versa my_list = ['a', 'b', 'c', 'd'] list_to_tuple = tuple(my_list) print(list_to_tuple) tuple_to_list = list(list_to_tuple) print(tuple_to_list) # convert string to tuple string_to_tuple = tuple('Hello') print(string_to_tuple)
5 2 3 ('a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b') (1, 2, 3, 4, 5, 6) ('a', 'b', 'c', 'd') ['a', 'b', 'c', 'd'] ('H', 'e', 'l', 'l', 'o')

Slicing

Access sub parts of the tuple wih the use of colon (:), just as with strings.

# a[start:stop:step], default step is 1 a = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) b = a[1:3] # Note that the last index is not included print(b) b = a[2:] # until the end print(b) b = a[:3] # from beginning print(b) b = a[::2] # start to end with every second item print(b) b = a[::-1] # reverse tuple print(b)
(2, 3) (3, 4, 5, 6, 7, 8, 9, 10) (1, 2, 3) (1, 3, 5, 7, 9) (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

Unpack tuple

# number of variables have to match number of tuple elements tuple_1 = ("Max", 28, "New York") name, age, city = tuple_1 print(name) print(age) print(city) # tip: unpack multiple elements to a list with * my_tuple = (0, 1, 2, 3, 4, 5) item_first, *items_between, item_last = my_tuple print(item_first) print(items_between) print(item_last)
Max 28 New York 0 [1, 2, 3, 4] 5

Nested tuples

Tuples can contain other tuples (or other container types).

a = ((0, 1), ('age', 'height')) print(a) print(a[0])
((0, 1), ('age', 'height')) (0, 1)

Compare tuple and list

The immutability of tuples enables Python to make internal optimizations. Thus, tuples can be more efficient when working with large data.

# compare the size import sys my_list = [0, 1, 2, "hello", True] my_tuple = (0, 1, 2, "hello", True) print(sys.getsizeof(my_list), "bytes") print(sys.getsizeof(my_tuple), "bytes") # compare the execution time of a list vs. tuple creation statement import timeit print(timeit.timeit(stmt="[0, 1, 2, 3, 4, 5]", number=1000000)) print(timeit.timeit(stmt="(0, 1, 2, 3, 4, 5)", number=1000000))
104 bytes 88 bytes 0.12474981700000853 0.014836141000017733