Ir al contenido principal

Tuplas: características y diferencias con las listas

Introducción

Las tuplas son una de las estructuras de datos fundamentales en Python, similares a las listas pero con diferencias importantes en cuanto a su comportamiento y uso. Son colecciones ordenadas de elementos que, a diferencia de las listas, no pueden ser modificadas una vez creadas. Esta característica de inmutabilidad las hace especialmente útiles en determinados contextos de programación donde necesitamos garantizar que los datos no cambiarán. En este artículo exploraremos qué son las tuplas, sus características principales y cómo se diferencian de las listas que ya conocemos.

Definición y creación de tuplas

Una tupla es una secuencia ordenada de elementos que pueden ser de cualquier tipo de datos. La sintaxis básica para crear una tupla utiliza paréntesis () en lugar de los corchetes [] que usamos para las listas.

# Creación de una tupla con diferentes tipos de datos
mi_tupla = (1, "Hola", 3.14, True)
print(mi_tupla)  # Salida: (1, 'Hola', 3.14, True)

# Tupla vacía
tupla_vacia = ()
print(tupla_vacia)  # Salida: ()

# Tupla con un solo elemento (requiere una coma al final)
tupla_unitaria = (5,)  # La coma es necesaria
print(tupla_unitaria)  # Salida: (5,)

# Sin la coma, Python interpreta (5) como simplemente el número 5
no_es_tupla = (5)
print(no_es_tupla)  # Salida: 5
print(type(no_es_tupla))  # Salida: <class 'int'>

También podemos crear tuplas sin usar paréntesis, simplemente separando los elementos con comas:

# Creación de tupla sin paréntesis
otra_tupla = 1, 2, 3, 4
print(otra_tupla)  # Salida: (1, 2, 3, 4)
print(type(otra_tupla))  # Salida: <class 'tuple'>

Una forma adicional de crear tuplas es utilizando la función tuple(), que puede convertir otros iterables (como listas) en tuplas:

# Creación de tupla a partir de una lista
lista = [10, 20, 30]
tupla_desde_lista = tuple(lista)
print(tupla_desde_lista)  # Salida: (10, 20, 30)

# Creación de tupla a partir de una cadena
tupla_desde_cadena = tuple("Python")
print(tupla_desde_cadena)  # Salida: ('P', 'y', 't', 'h', 'o', 'n')

Acceso a elementos de las tuplas

El acceso a los elementos de una tupla es idéntico al de las listas, utilizando índices que comienzan en 0:

colores = ("rojo", "verde", "azul", "amarillo", "negro")

# Acceso por índice positivo (desde el principio)
print(colores[0])  # Salida: rojo
print(colores[2])  # Salida: azul

# Acceso por índice negativo (desde el final)
print(colores[-1])  # Salida: negro
print(colores[-3])  # Salida: azul

# Slicing (rebanado)
print(colores[1:4])  # Salida: ('verde', 'azul', 'amarillo')
print(colores[:2])   # Salida: ('rojo', 'verde')
print(colores[2:])   # Salida: ('azul', 'amarillo', 'negro')
print(colores[::2])  # Salida: ('rojo', 'azul', 'negro')

Inmutabilidad de las tuplas

La característica principal que diferencia a las tuplas de las listas es su inmutabilidad. Una vez creada una tupla, no podemos cambiar, añadir o eliminar elementos:

numeros = (1, 2, 3, 4, 5)

# Intentar modificar un elemento genera un error
try:
    numeros[0] = 10
except TypeError as e:
    print(f"Error: {e}")  # Salida: Error: 'tuple' object does not support item assignment

# Tampoco podemos usar métodos como append(), insert(), remove(), etc.

Sin embargo, si una tupla contiene objetos mutables como listas, esos objetos internos sí pueden ser modificados:

# Tupla con una lista como elemento
tupla_con_lista = (1, 2, [3, 4])
print(tupla_con_lista)  # Salida: (1, 2, [3, 4])

# No podemos cambiar la tupla, pero sí la lista dentro de ella
tupla_con_lista[2][0] = 30
print(tupla_con_lista)  # Salida: (1, 2, [30, 4])

Operaciones con tuplas

Aunque las tuplas son inmutables, podemos realizar varias operaciones con ellas:

Concatenación

tupla1 = (1, 2, 3)
tupla2 = (4, 5, 6)
tupla_concatenada = tupla1 + tupla2
print(tupla_concatenada)  # Salida: (1, 2, 3, 4, 5, 6)

Repetición

tupla = (1, 2)
tupla_repetida = tupla * 3
print(tupla_repetida)  # Salida: (1, 2, 1, 2, 1, 2)

Comprobación de pertenencia

frutas = ("manzana", "naranja", "plátano", "uva")
print("naranja" in frutas)  # Salida: True
print("pera" in frutas)     # Salida: False

Longitud, máximo, mínimo y suma

numeros = (5, 2, 8, 1, 9)
print(len(numeros))    # Salida: 5
print(max(numeros))    # Salida: 9
print(min(numeros))    # Salida: 1
print(sum(numeros))    # Salida: 25

Métodos de las tuplas

Las tuplas tienen muy pocos métodos debido a su inmutabilidad:

valores = (5, 2, 8, 2, 1, 5, 9)

# Método count(): cuenta las ocurrencias de un elemento
print(valores.count(5))  # Salida: 2
print(valores.count(3))  # Salida: 0

# Método index(): devuelve la posición de la primera ocurrencia
print(valores.index(8))  # Salida: 2
print(valores.index(2))  # Salida: 1 (primera ocurrencia)

# Si el elemento no está en la tupla, index() produce un error
try:
    print(valores.index(10))
except ValueError as e:
    print(f"Error: {e}")  # Salida: Error: tuple.index(x): x not in tuple

Desempaquetado de tuplas

Una característica muy útil de las tuplas es el desempaquetado, que nos permite asignar los elementos de una tupla a múltiples variables en una sola operación:

# Desempaquetado básico
coordenadas = (10, 20)
x, y = coordenadas
print(f"x = {x}, y = {y}")  # Salida: x = 10, y = 20

# Desempaquetado con más elementos
datos_persona = ("Ana", "López", 28, "Madrid")
nombre, apellido, edad, ciudad = datos_persona
print(f"{nombre} {apellido}, {edad} años, vive en {ciudad}")
# Salida: Ana López, 28 años, vive en Madrid

# Desempaquetado parcial con *
primero, *resto, ultimo = (1, 2, 3, 4, 5)
print(primero)  # Salida: 1
print(resto)    # Salida: [2, 3, 4]
print(ultimo)   # Salida: 5

Este desempaquetado es muy común en Python, por ejemplo, para intercambiar valores de variables:

# Intercambio de valores (swap)
a, b = 5, 10
print(f"Antes: a = {a}, b = {b}")  # Salida: Antes: a = 5, b = 10
a, b = b, a  # Utilizando tuplas implícitas
print(f"Después: a = {a}, b = {b}")  # Salida: Después: a = 10, b = 5

Uso de tuplas como claves de diccionarios

A diferencia de las listas, las tuplas pueden ser usadas como claves en diccionarios, ya que son inmutables y por tanto, hasheables:

# Usando tuplas como claves en un diccionario
coordenadas_valores = {
    (0, 0): "Origen",
    (1, 0): "Este",
    (0, 1): "Norte",
    (1, 1): "Noreste"
}

print(coordenadas_valores[(0, 0)])  # Salida: Origen
print(coordenadas_valores[(1, 1)])  # Salida: Noreste

Diferencias entre tuplas y listas

Ahora que ya conocemos las tuplas, veamos un resumen comparativo con las listas:

Característica Tuplas Listas
Sintaxis Paréntesis () Corchetes []
Mutabilidad Inmutables Mutables
Métodos Pocos (solo count() e index()) Muchos (append(), insert(), remove(), etc.)
Rendimiento Ligeramente más rápidas Ligeramente más lentas
Uso como clave en diccionarios Sí (si todos sus elementos son inmutables) No
Uso común Datos que no deben cambiar Colecciones que necesitan modificarse

¿Cuándo usar tuplas en lugar de listas?

Las tuplas son preferibles en los siguientes casos:

  1. Datos que no deben cambiar: Cuando queremos asegurarnos de que los datos no serán modificados accidentalmente.
  2. Claves de diccionarios: Cuando necesitamos usar una colección como clave en un diccionario.
  3. Retorno múltiple de funciones: Para devolver varios valores desde una función.
  4. Rendimiento: En programas donde el rendimiento es crítico, ya que las tuplas son ligeramente más eficientes.
  5. Documentación implícita: Como indicación de que los datos no deben ser modificados.
# Ejemplo de función que devuelve múltiples valores como tupla
def obtener_dimensiones_rectangulo(base, altura):
    area = base * altura
    perimetro = 2 * (base + altura)
    diagonal = (base**2 + altura**2) ** 0.5
    return area, perimetro, diagonal  # Devuelve una tupla implícita

# Llamada a la función y desempaquetado
a, p, d = obtener_dimensiones_rectangulo(3, 4)
print(f"Área: {a}, Perímetro: {p}, Diagonal: {d}")
# Salida: Área: 12, Perímetro: 14, Diagonal: 5.0

Resumen

Las tuplas son estructuras de datos inmutables en Python que ofrecen una forma segura de almacenar colecciones de elementos que no deben cambiar. Su sintaxis basada en paréntesis, su capacidad para ser usadas como claves en diccionarios y su eficiencia en operaciones de lectura las hacen ideales para ciertos escenarios. Aunque comparten muchas similitudes con las listas en cuanto a indexación y operaciones como la concatenación, su inmutabilidad las distingue claramente, ofreciendo ventajas específicas en términos de seguridad de datos y garantías de integridad. En el próximo artículo, exploraremos los diccionarios, otra estructura de datos fundamental en Python que nos permitirá trabajar con pares clave-valor.