Introduction
Tuples are immutable, ordered sequences of elements similar to lists in Python. They serve as fast, lightweight ways to store related pieces of heterogenous data.
Some key benefits of tuples include:
- Faster than lists due to immutability and storage contiguity
- Lightweight data storage
- Convenient for accessing and passing around small aggregations of data
- Used as keys in dictionaries and elements in sets
You should choose tuples over lists when:
- You need an immutable sequence
- Performance is critical
- You want to use the sequence as a key in a dictionary
- You need to store constant data
This article will cover everything you need to know about creating, accessing, manipulating and comparing tuples in Python.
How to Create Tuples
There are several different ways to initialize tuples in Python:
Using Parentheses
The most straightforward way to create a tuple is by enclosing elements inside parentheses (), separated by commas:
>>> my_tuple = (1, 2, 3)
The parentheses can even be omitted – Python knows it is a tuple due to the commas separating elements:
>>> my_tuple = 1, 2, 3
Using the tuple() Constructor
You can convert another iterable like a list or string into a tuple using the tuple() constructor:
>>> my_list = [4, 5, 6]
>>> my_tuple = tuple(my_list) # (4, 5, 6)
Creating Empty Tuples
To create empty tuples, call the tuple constructor without any arguments or use empty parentheses:
>>> empty_tuple = ()
>>> another_empty_tuple = tuple()
Creating Single-Element Tuples
There is one tricky case – tuples with a single element need a trailing comma:
>>> not_a_tuple = (1) # Without comma this is an integer
>>> a_tuple = (1,) # With trailing comma this is a tuple
The trailing comma distinguishes it from a number enclosed in parentheses.
Accessing Tuple Elements
Several methods exist for retrieving tuple elements:
Indexing
You can access elements by their index like with lists:
>>> my_tuple = (‘a‘, ‘b‘, ‘c‘, ‘d‘)
>>> print(my_tuple[1]) # ‘b‘
>>> print(my_tuple[-1]) # ‘d‘ - Negative indexes wrap around
Slicing
You can slice tuples like lists for sub-sequences:
>>> my_tuple[1:3] # (‘b‘, ‘c‘) - Slices from index 1 up to 3
Iterating
You can iterate directly over tuples in for loops:
>>> for element in my_tuple:
>>> print(element)
Destructuring
You can destructure (unpack) tuples into named variables as well:
>>> my_tuple = (1, ‘Hello‘, 3.4)
>>> a, b, c = my_tuple
>>> print(a) # 1
>>> print(b) # ‘Hello‘
This is useful for immediately accessing elements.
Tuple Methods
Tuples have built-in methods for common operations:
count()
Counts occurrences of a value:
>>> (1, 5, 3, 5).count(5) # 2
index()
Gets index of first matching value:
>>> (1, 5, 3).index(5) # 1
len()
Gets length:
>>> len((1, 2, 3, 4)) # 4
min()/max()
Minimum and maximum values:
>>> min((3, 4, 1)) # 1
>>> max((3, 4, 1)) # 4
sorted()
Returns new sorted list from tuple:
>>> sorted((5, 3, 2)) # [2, 3, 5]
You can even concatenate and repeat tuples:
>>> (1, 2) + (3, 4) # (1, 2, 3, 4)
>>> (1, 2) * 2 # (1, 2, 1, 2)
Comparing Tuples and Lists
What are the main differences between tuples and lists in Python?
Immutability
Tuples are immutable meaning they cannot be changed after creation. Lists are mutable.
Performance
Tuples are faster than lists since they are immutable. Lists require more overhead to account for potential growth operations.
Use Cases
Use tuples for immutable, constant data. Use lists for mutable data.
Tuples in Action
Tuples unlock several useful coding patterns:
Returning Multiple Values from Functions
It is common for functions to return tuples with multiple values computed:
def min_max(numbers):
return (min(numbers), max(numbers))
min_value, max_value = min_max([1, 2, -1, 4])
Unpacking Assignment Statements
You can unpack tuples into variables inside assignment statements:
>>> point = (10, 20)
>>> x, y = point
>>> print(x) # 10
Write Protecting Elements
Since tuples are immutable, using them can prevent accidental writes/corruption of critical values in code.
Common Tuple Operations
Many built-ins and standard library functions accept tuples:
Sorting
Use sorted() to stably sort tuples:
>>> houses = (‘Ravenclaw‘, ‘Hufflepuff‘, ‘Slytherin‘, ‘Gryffindor‘)
>>> print(sorted(houses))
Reversing
reversed() iterates a tuple‘s elements backwards:
>>> for house in reversed(houses):
>>> print(house)
Mapping
map() applies a function to each element:
>>> numbers = (1, 2, 3)
>>> squares = map(lambda x: x**2, numbers) # (1, 4, 9)
Filtering
filter() creates a tuple with elements that pass a condition:
>>> values = (1, 2, 3, 4)
>>> evens = filter(lambda x: x % 2 == 0, values) # (2, 4)
Tuples vs Other Data Structures
How do tuples compare to other built-in data structures?
Tuples vs Lists
Lists are mutable while tuples are immutable. Use tuples for constant data and lists for modifiable data.
Tuples vs Sets
Sets are unordered and contain only unique elements while tuples can contain duplicates and preserve element order.
Tuples vs Dictionaries
Dictionaries map keys to values. Tuples are simplified storage with just ordered values.
Advanced Tuple Usage
Tuples enable some advanced capabilities:
Nested Tuples
Tuples can contain other tuples and arbitrary data structures:
>>> locations = [(‘Nevada‘, ‘Las Vegas‘), (‘Arizona‘, ‘Phoenix‘)]
Named Tuples
Named tuples associate names with each position:
>>> from collections import namedtuple
>>> Point = namedtuple(‘Point‘, ‘x y‘)
>>> p = Point(10, 20)
>>> p.x # 10
>>> p.y # 20
Tuple Comprehension
Comprehensions provide concise tuple initialization syntax:
>>> values = range(10)
>>> tuples = (x**2 for x in values if x % 2 == 0)
Conclusion
Tuples are core Python data structures that store ordered, heterogeneous, immutable data. Key points about tuples:
- Faster than lists but less flexible due to immutability
- Convenient for bundling related pieces of constant data
- Created with commas inside parentheses or via the tuple constructor
- Elements accessed by index, slice or iteration
- Many built-in methods like count(), index(), sorting
- Used for multiple return values, unpacking data and write protection
Tuples should be preferred over lists when immutability and speed is critical. They complement Python‘s lists, sets, dictionaries as ubiquitous data storage tools.