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.