Python: Tuple

Tuples are immutable lists.

In order to define a tuple, use this syntax:

binding_partners = (
    "BIOGRID:112315",
    "BIOGRID:108607"  # no comma
)

Leaving an additional comma after the last element also works:

binding_partners = (
    "BIOGRID:112315",
    "BIOGRID:108607", # this comma makes no difference
)

Tuples should be used instead of lists whenever mutability is an issue, for instance as dictionary keys.

Example. Let’s create a bunch of different tuples:

# A tuple of integers
integers = (1, 2, 3, 1)

# A tuple of strings
uniprot_proteins = ("Y08501", "Q95747")

# A tuple of heterogeneous objects
things = ("Y08501", 0.13, "Q95747", 0.96)

# A tuple of tuples
two_level_tuple = (
    ("Y08501", 120, 520),
    ("Q95747", 550, 920),
)

Example. Empty and length-one tuples are a bit weird. I will not explain how to create empty tuples, they are very rare (and not really useful).

But let’s assume for the sake of illustration that we need to create a tuple with just one element, say the integer 0. This does not work:

tuple = (0)
print tuple
print type(tuple)   # not a tuple!

The reason is that (0) is interpreted by Python as an arithmetical expression. Indeed, this is what the syntax means: an integer within a pair of brackets.

In order to define such a one-element tuple, write:

tuple = (0,)
print tuple
print type(tuple)   # it's a tuple!

Now the ambiguity is gone: the comma , in there makes it clear to Python that we want to create a tuple – except that it contains only one element.


Operators

Most list operators can be used with tuples as well. Of course, since tuples are immutable, operators that change the value of lists (like the assignment operator) do not carry over to tuples.

Returns Operator Meaning
int len(tuple) Compute the length of a tuple
tuple tuple + tuple Concatenate two tuples
tuple tuple * int Replicate a tuple
bool object in tuple Check whether an element appears in a tuple
tuple tuple[int:int] Extract a sub-tuple

Example. Let’s create a tuple with mixed object types:

protein_info = ("2B0Q", "phosphotransferase", "PF03881")

It holds information about a given protein (PDB identifier 2B0Q). We can access the various elements as if it were a list:

protein_id = protein_info[0]
print protein_id

protein_name = protein_info[1]
print protein_name

However, we can not modify the tuple in any way:

>>> protein_info[0] = "1A3A"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment


Methods

Returns Method Meaning
int list.index(object) Return the index of the first occurrence of an object
int list.count(object) Count the number of occurrences of an object

These are identical to their list counterparts.


List-Tuple Conversion

In some cases you want to modify a tuple, but you can’t. In other cases you want to use a list as a key in a dictionary, but you can’t.

The tricks is to convert between tuples and lists as needed. In order to convert between the two, use the tuple() and list() functions:

l = range(10)
print l, type(l)

t = tuple(l)
print t, type(t)

l = list(t)
print l, type(l)

Example. We want to modify a given tuple:

t = ("I", "am", "a", "tuple")
print t

Let’s proceed as follows:

l = list(t)
l.insert(2, "pretty")
t2 = tuple(l)

print t
print t2

Of course, we did not modify the original tuple; rather, we created a new tuple from an intermediate list.