Ir al contenido principal

Listas: creación, acceso y modificación

Introducción

Las listas son una de las estructuras de datos más versátiles y utilizadas en Python. A diferencia de otros lenguajes de programación donde los arrays tienen un tamaño fijo, las listas de Python son dinámicas, permitiendo almacenar elementos de diferentes tipos y modificar su contenido en cualquier momento. Esta flexibilidad las convierte en la herramienta perfecta para gestionar colecciones de datos en casi cualquier proyecto. En este artículo, aprenderemos a crear listas, acceder a sus elementos y modificar su contenido de forma eficiente.

Creación de listas

Existen varias formas de crear listas en Python:

1. Usando corchetes []

La forma más común de crear una lista es utilizando corchetes:

# Lista vacía
lista_vacia = []

# Lista con elementos del mismo tipo
numeros = [1, 2, 3, 4, 5]
nombres = ["Ana", "Juan", "Elena", "Carlos"]

# Lista con elementos de diferentes tipos
mixta = [1, "Hola", True, 3.14]

print(lista_vacia)  # Output: []
print(numeros)      # Output: [1, 2, 3, 4, 5]
print(nombres)      # Output: ['Ana', 'Juan', 'Elena', 'Carlos']
print(mixta)        # Output: [1, 'Hola', True, 3.14]

2. Usando el constructor list()

También podemos crear listas utilizando la función incorporada list():

# A partir de un rango
lista_rango = list(range(1, 6))  # Crea [1, 2, 3, 4, 5]

# A partir de una cadena
lista_cadena = list("Python")    # Crea ['P', 'y', 't', 'h', 'o', 'n']

# A partir de una tupla
lista_tupla = list((1, 2, 3))    # Crea [1, 2, 3]

print(lista_rango)  # Output: [1, 2, 3, 4, 5]
print(lista_cadena) # Output: ['P', 'y', 't', 'h', 'o', 'n']
print(lista_tupla)  # Output: [1, 2, 3]

3. Usando comprensión de listas

Como vimos en el artículo anterior, podemos crear listas con la sintaxis de comprensión:

cuadrados = [x**2 for x in range(1, 6)]
print(cuadrados)  # Output: [1, 4, 9, 16, 25]

4. Usando la multiplicación de listas

Podemos crear listas repetitivas utilizando el operador de multiplicación:

ceros = [0] * 5
repetida = [1, 2] * 3

print(ceros)      # Output: [0, 0, 0, 0, 0]
print(repetida)   # Output: [1, 2, 1, 2, 1, 2]

Acceso a elementos de una lista

1. Acceso por índice

Los elementos de una lista están indexados a partir de 0:

frutas = ["manzana", "naranja", "plátano", "uva"]

# Acceso a elementos individuales
print(frutas[0])  # Output: manzana
print(frutas[2])  # Output: plátano

# Índices negativos (cuentan desde el final)
print(frutas[-1])  # Output: uva (último elemento)
print(frutas[-2])  # Output: plátano (penúltimo elemento)

2. Slicing (rebanado)

Podemos extraer una sublista utilizando la sintaxis de slicing:

numeros = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# Sintaxis básica: lista[inicio:fin:paso]
# Nota: el índice fin no se incluye en el resultado

# Extraer sublistas
print(numeros[2:5])     # Output: [2, 3, 4]
print(numeros[:3])      # Output: [0, 1, 2] (desde el inicio hasta el índice 2)
print(numeros[7:])      # Output: [7, 8, 9] (desde el índice 7 hasta el final)
print(numeros[:])       # Output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (copia completa)

# Con paso
print(numeros[1:9:2])   # Output: [1, 3, 5, 7] (del índice 1 al 8, paso 2)
print(numeros[::3])     # Output: [0, 3, 6, 9] (toda la lista, paso 3)

# Con índices negativos
print(numeros[-3:])     # Output: [7, 8, 9] (los últimos 3 elementos)
print(numeros[:-2])     # Output: [0, 1, 2, 3, 4, 5, 6, 7] (todos excepto los últimos 2)

# Invertir una lista
print(numeros[::-1])    # Output: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

3. Acceso mediante bucles

Podemos recorrer todos los elementos de una lista:

colores = ["rojo", "verde", "azul"]

# Usando for
for color in colores:
    print(color)

# Usando for con índice
for i in range(len(colores)):
    print(f"Índice {i}: {colores[i]}")

# Usando enumerate para obtener índice y valor
for i, color in enumerate(colores):
    print(f"Posición {i}: {color}")

Modificación de listas

Las listas en Python son mutables, lo que significa que podemos modificar sus contenidos después de crearlas.

1. Modificar elementos individuales

numeros = [10, 20, 30, 40, 50]

# Cambiar un valor
numeros[2] = 35
print(numeros)  # Output: [10, 20, 35, 40, 50]

# Cambiar múltiples valores usando slicing
numeros[1:3] = [25, 38]
print(numeros)  # Output: [10, 25, 38, 40, 50]

# Cambiar múltiples valores por un número diferente de elementos
numeros[1:4] = [22, 33]  # Reemplaza 3 elementos por 2
print(numeros)  # Output: [10, 22, 33, 50]

2. Agregar elementos

Hay varias formas de añadir elementos a una lista:

frutas = ["manzana", "naranja"]

# Agregar un elemento al final
frutas.append("plátano")
print(frutas)  # Output: ['manzana', 'naranja', 'plátano']

# Insertar un elemento en una posición específica
frutas.insert(1, "limón")
print(frutas)  # Output: ['manzana', 'limón', 'naranja', 'plátano']

# Agregar múltiples elementos al final
frutas.extend(["uva", "pera"])
print(frutas)  # Output: ['manzana', 'limón', 'naranja', 'plátano', 'uva', 'pera']

# Concatenar listas con el operador +
mas_frutas = frutas + ["kiwi", "cereza"]
print(mas_frutas)  # Output: ['manzana', 'limón', 'naranja', 'plátano', 'uva', 'pera', 'kiwi', 'cereza']

3. Eliminar elementos

Existen varias formas de eliminar elementos:

numeros = [10, 20, 30, 40, 50, 60, 70]

# Eliminar por índice usando del
del numeros[2]
print(numeros)  # Output: [10, 20, 40, 50, 60, 70]

# Eliminar el último elemento y devolverlo
ultimo = numeros.pop()
print(ultimo)    # Output: 70
print(numeros)   # Output: [10, 20, 40, 50, 60]

# Eliminar elemento en posición específica y devolverlo
elemento = numeros.pop(2)
print(elemento)  # Output: 40
print(numeros)   # Output: [10, 20, 50, 60]

# Eliminar la primera ocurrencia de un valor
numeros.remove(20)
print(numeros)   # Output: [10, 50, 60]

# Eliminar varios elementos usando slicing
numeros[1:] = []
print(numeros)   # Output: [10]

# Vaciar la lista completamente
numeros.clear()
print(numeros)   # Output: []

4. Ordenar y reorganizar

Podemos reorganizar los elementos de una lista:

numeros = [3, 1, 4, 1, 5, 9, 2, 6]

# Ordenar la lista (modifica la lista original)
numeros.sort()
print(numeros)  # Output: [1, 1, 2, 3, 4, 5, 6, 9]

# Ordenar en orden descendente
numeros.sort(reverse=True)
print(numeros)  # Output: [9, 6, 5, 4, 3, 2, 1, 1]

# Obtener una nueva lista ordenada (no modifica la original)
desordenados = [5, 2, 8, 1, 3]
ordenados = sorted(desordenados)
print(desordenados)  # Output: [5, 2, 8, 1, 3] (sin cambios)
print(ordenados)     # Output: [1, 2, 3, 5, 8]

# Invertir el orden de los elementos
desordenados.reverse()
print(desordenados)  # Output: [3, 1, 8, 2, 5]

Otras operaciones útiles

1. Búsqueda de elementos

frutas = ["manzana", "naranja", "plátano", "uva", "naranja"]

# Verificar si un elemento existe en la lista
tiene_platano = "plátano" in frutas
print(tiene_platano)  # Output: True

# Encontrar la posición de un elemento
posicion = frutas.index("naranja")
print(posicion)  # Output: 1 (primera ocurrencia)

# Contar ocurrencias de un elemento
total_naranjas = frutas.count("naranja")
print(total_naranjas)  # Output: 2

2. Copiar listas

Es importante entender que al asignar una lista a otra variable, no se crea una copia independiente:

lista1 = [1, 2, 3]
lista2 = lista1  # Ambas variables apuntan a la misma lista

lista2[0] = 10
print(lista1)  # Output: [10, 2, 3] (también se modifica)

# Para crear una copia independiente:
# Método 1: Usar el método copy()
lista3 = lista1.copy()

# Método 2: Usar la función list()
lista4 = list(lista1)

# Método 3: Usar slicing
lista5 = lista1[:]

# Probemos la independencia
lista3[0] = 100
print(lista1)  # Output: [10, 2, 3] (sin cambios)
print(lista3)  # Output: [100, 2, 3]

3. Listas anidadas (matrices)

Las listas pueden contener otras listas:

# Crear una matriz 3x3
matriz = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# Acceder a elementos
print(matriz[1][2])  # Output: 6 (fila 1, columna 2)

# Modificar un elemento
matriz[0][0] = 10
print(matriz)  # Output: [[10, 2, 3], [4, 5, 6], [7, 8, 9]]

# Recorrer la matriz
for fila in matriz:
    for elemento in fila:
        print(elemento, end=" ")
    print()  # Nueva línea después de cada fila

Resumen

Las listas son estructuras de datos fundamentales en Python que nos permiten almacenar y manipular colecciones de elementos de manera flexible. Hemos aprendido a crearlas utilizando diferentes métodos, a acceder a sus elementos mediante índices y slicing, y a modificar su contenido a través de diversas operaciones. Además, hemos explorado técnicas para buscar elementos, copiar listas y trabajar con estructuras más complejas como las matrices. En el próximo artículo, exploraremos las tuplas, una estructura de datos similar a las listas pero con características diferentes. Con estas herramientas, estarás preparado para manejar eficientemente colecciones de datos en tus programas Python.