Operaciones con listas en Python
El ordenamiento de listas es una tarea fundamental en la programación y en la ciencia de la computación. Existen diversos algoritmos de ordenamiento, cada uno con sus propias características y eficiencia. Uno de los algoritmos más conocidos y sencillos es el algoritmo Burbuja (Bubble Sort). Este algoritmo funciona comparando cada par de elementos adyacentes en una lista y, si están en el orden incorrecto, los intercambia. Este proceso se repite hasta que la lista esté completamente ordenada. Aunque no es el más eficiente para listas grandes, el algoritmo Burbuja es fácil de entender y de implementar, lo que lo convierte en una excelente herramienta pedagógica para aprender sobre ordenamiento.

Consideraciones Iniciales
- Indexación con Base en Cero: La indexación basada en cero es un sistema de numeración en el que el primer elemento de una lista se encuentra en la posición 0. Cada elemento subsiguiente se encuentra en una posición que es uno más que la posición del elemento anterior.
mi_lista = ['manzana', 'banana', 'cereza'] # Accediendo a los elementos usando índices basados en cero primer_elemento = mi_lista[0] # 'manzana' segundo_elemento = mi_lista[1] # 'banana' tercer_elemento = mi_lista[2] # 'cereza'
- Mutabilidad: Las listas son mutables, lo que significa que pueden modificarse después de su creación.
- Orden: Los elementos de una lista mantienen un orden específico.
- Heterogeneidad: Una lista puede contener elementos de diferentes tipos.
- Referencia o paso por referencia: Cuando se hace una asignación de una lista a otra, como
lista_2 = lista_1
, ambas variables (lista_1 y lista_2
) apuntan al mismo objeto en memoria. Esto significa que no se realiza una copia independiente de los elementos de la lista, sino que ambas variables hacen referencia al mismo espacio de memoria. Por lo tanto, modificar cualquiera de las dos listas afectará a la otra, ya que ambas apuntan a la misma ubicación en memoria.lista_1 = [1, 2, 3] lista_2 = lista_1 # Ambos apuntan al mismo objeto en memoria lista_2.append(4) # Modificamos lista_2 print(lista_1) # Salida: [1, 2, 3, 4] print(lista_2) # Salida: [1, 2, 3, 4]
lista_2
, también se modificalista_1
, porque ambas comparten la misma referencia al objeto en memoria.
Creación de Listas
Las listas en Python se pueden crear de varias maneras:
- Utilizando los corchetes
[]
:mi_lista = [1, 2, 3, 4, 5]
- Crear listas vacías y luego agregar elementos:
lista_vacia = [] lista_vacia.append(1) lista_vacia.append(2)
- A partir de un rango:
numeros = lista(range(5)) # [0, 1, 2, 3, 4]
- Crear listas a partir de otras estructuras de datos, como tuplas o cadenas:
tupla = (1, 2, 3) lista_desde_tupla = list(tupla) # [1, 2, 3] cadena = "Hola" lista_desde_cadena = list(cadena) # ['H', 'o', 'l', 'a']
Adición de Listas
En Python hay varias formas de adicionar/combinar listas. Se explicará las formas más comunes:
- Usando el operador
+
(concatenación):lista1 = [1, 2, 3] lista2 = [4, 5, 6] lista_combinada = lista1 + lista2 print(lista_combinada) # Salida: [1, 2, 3, 4, 5, 6]
- Usando el método
extend()
:lista1 = [1, 2, 3] lista2 = [4, 5, 6] lista1.extend(lista2) print(lista1) # Salida: [1, 2, 3, 4, 5, 6]
- Usando el método
append()
en un ciclo (si se necesita agregar elemento por elemento):lista1 = [1, 2, 3] lista2 = [4, 5, 6] for elemento in lista2: lista1.append(elemento) print(lista1) # Salida: [1, 2, 3, 4, 5, 6]
Diferencias importantes:
- El operador
+
crea una nueva lista extend()
modifica la lista original-
append()
agregaría la lista completa como un único elemento si no se usa en un ciclo
La forma más eficiente y recomendada es usar extend()
cuando se quiera combinar dos listas.
Eliminación de Listas
En Python sólo hay una forma de eliminar una lista, es decir borrar todos los elementos.
Usando clear()
: Elimina todos los elementos de la lista:
lista = [1, 2, 3, 4]
lista.clear()
print(lista) # Salida: []
Duplicar Listas
Para duplicar una lista en Python y asegurarse de que la copia sea independiente (es decir, que los cambios en una no afecten a la otra), se pueden usar varios métodos. Aquí se presentan las opciones más comunes y sus aplicaciones:
- Usar el método
copy()
: El métodocopy()
realiza una copia superficial de la lista.mi_lista = [1, 2, 3] lista_copia = mi_lista.copy() lista_copia.append(4) print(mi_lista) # Salida: [1, 2, 3] print(lista_copia) # Salida: [1, 2, 3, 4]
- Usar rebanado (slicing): El rebanado con
[:]
crea una nueva lista con los mismos elementos.mi_lista = [1, 2, 3] lista_copia = mi_lista[:] lista_copia.append(4) print(mi_lista) # Salida: [1, 2, 3] print(lista_copia) # Salida: [1, 2, 3, 4]
mi_lista = [1, 2, 3, 4] lista_copia = mi_lista[1:-1] print(lista_copia) # Salida: [2, 3]
mi_lista = [1, 2, 3, 4] lista_copia = mi_lista[-1:4] print(lista_copia) # Salida: []
my_list[:n] = my_list[0:n]
Si se omite el último índice de la rebanada, es equivalente a un índice igual a n.
my_list[start:] = my_list[start:n]
- Usar el constructor
list()
: El constructorlist()
crea una nueva lista con los elementos de la original.mi_lista = [1, 2, 3] lista_copia = list(mi_lista) lista_copia.append(4) print(mi_lista) # Salida: [1, 2, 3] print(lista_copia) # Salida: [1, 2, 3, 4]
- Usar la librería
copy
para copias profundas: Si la lista contiene sublistas u otros objetos mutables, se debe usar una copia profunda para que las sublistas también sean independientes. Esto se logra con la funcióncopy.deepcopy()
.import copy mi_lista = [[1, 2], [3, 4]] lista_copia = copy.deepcopy(mi_lista) lista_copia[0].append(99) print(mi_lista) # Salida: [[1, 2], [3, 4]] print(lista_copia) # Salida: [[1, 2, 99], [3, 4]]
Modificación de Listas
Acceso a Elementos
- Los elementos de una lista se pueden acceder utilizando índices. Recordar que los índices en Python comienzan en 0:
mi_lista = [10, 20, 30, 40, 50] print(mi_lista[0]) # Salida: 10 print(mi_lista[2]) # Salida: 30
- También se tiene acceso a los elementos desde el final de la lista usando índices negativos:
print(mi_lista[-1]) # Salida: 50 print(mi_lista[-2]) # Salida: 40
Agregar Elementos
- Usando el método
append()
: Añade un elemento al final.mi_lista = [1, 2, 3] mi_lista.append(4) print(mi_lista) # Salida: [1, 2, 3, 4]
- Usando el método
insert()
: Inserta un elemento en una posición específica.mi_lista = [1, 2, 4] mi_lista.insert(2, 3) # Inserta el número 3 en la posición 2 print(mi_lista) # Salida: [1, 2, 3, 4]
- Usando el método
extend()
: Agrega varios elementos al final de la lista.mi_lista = [1, 2] mi_lista.extend([3, 4]) print(mi_lista) # Salida: [1, 2, 3, 4]
Eliminar Elementos
- Usando el método
remove()
: Elimina la primera aparición de un valor específico.mi_lista = [1, 2, 3, 4] mi_lista.remove(3) print(mi_lista) # Salida: [1, 2, 4]
- Usando el método
pop()
: Elimina un elemento por su índice (o el último elemento si no se especifica un índice).mi_lista = [1, 2, 3, 4] mi_lista.pop(2) # Elimina el elemento en la posición 2 print(mi_lista) # Salida: [1, 2, 4]
- Usando el método
del()
: Elimina un elemento o una porción de la lista.mi_lista = [1, 2, 3, 4] del mi_lista[1] # Elimina el segundo elemento print(mi_lista) # Salida: [1, 3, 4] mi_lista = [1, 2, 3, 4] del mi_lista[:] print(mi_lista) #Salida: []
Cambiar Elementos
Se puede acceder a un elemento de la lista por su índice y asignarle un nuevo valor.
mi_lista = [1, 2, 3, 4]
mi_lista[1] = 20 # Cambia el segundo elemento
print(mi_lista) # Salida: [1, 20, 3, 4]
Modificar con Rebanadas (Slices)
Se puede reemplazar un rango de elementos con otros.
mi_lista = [1, 2, 3, 4]
mi_lista[1:3] = [20, 30] # Cambia los elementos en las posiciones 1 y 2
print(mi_lista) # Salida: [1, 20, 30, 4]
Ordenar elementos
Se tienen dos opciones:
- Usar
sort()
: Ordena la lista en su lugar.mi_lista = [4, 1, 3, 2] mi_lista.sort() print(mi_lista) # Salida: [1, 2, 3, 4]
- Usar
reverse()
: Invierte el orden de los elementos.mi_lista = [1, 2, 3, 4] mi_lista.reverse() print(mi_lista) # Salida: [4, 3, 2, 1]
Búsqueda de Elementos
- Verificar si un elemento está en la lista: Se usa el operador
in
para determinar si un elemento está presente.mi_lista = [1, 2, 3, 4] print(3 in mi_lista) # Salida: True print(5 in mi_lista) # Salida: False
- Encontrar el índice de un elemento: Se usa el método
index()
para obtener la posición del primer elemento coincidente.mi_lista = [1, 2, 3, 4, 3] indice = mi_lista.index(3) print(indice) # Salida: 2
- Si el elemento no está en la lista, se genera un error
ValueError
. - Para evitarlo, se puede usar una verificación previa con
in
:
if 5 in mi_lista: print(mi_lista.index(5)) else: print("El elemento no está en la lista")
- Si el elemento no está en la lista, se genera un error
- Usar
filter()
: Devuelve los elementos que cumplen una condición específica.mi_lista = [1, 2, 3, 4, 5] pares = list(filter(lambda x: x % 2 == 0, mi_lista)) print(pares) # Salida: [2, 4]
- Usar
any
yall
:-
any
: RetornaTrue
si al menos un elemento cumple la condición. -
all
: RetornaTrue
si todos los elementos cumplen la condición.
mi_lista = [1, 2, 3, 4, 5] print(any(x > 4 for x in mi_lista)) # Salida: True print(all(x > 0 for x in mi_lista)) # Salida: True
-
Repetir elementos en una lista
Si se necesita repetir todos los elementos de una lista, se pueden usar el operador *
o métodos específicos.
lista_repetida = [0] * 5 # [0, 0, 0, 0, 0]
mi_lista = [1, 2, 3]
repetida = mi_lista * 3
print(repetida) # Salida: [1, 2, 3, 1, 2, 3, 1, 2, 3]
Arreglos de Dos Dimensiones
En Python, los arreglos de dos dimensiones se pueden representar utilizando listas anidadas, también conocidas como listas de listas. Cada elemento de la lista principal es otra lista, lo que permite almacenar datos en una estructura de matriz.
Creación de un Arreglo de Dos Dimensiones
Se puede crear un arreglo de dos dimensiones inicializando una lista de listas. Por ejemplo:
# Crear un arreglo de 2x3
arreglo_2d = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
Acceso a Elementos
Para acceder a un elemento específico en un arreglo de dos dimensiones, es necesario proporcionar dos índices: uno para la fila y otro para la columna.
# Acceder al elemento en la fila 1, columna 2 (índice 0-based)
elemento = arreglo_2d[1][2] # Salida: 6
print(elemento)
Modificación de Elementos
Se modifica un elemento específico proporcionando los índices de fila y columna.
# Modificar el elemento en la fila 0, columna 1
arreglo_2d[0][1] = 20
print(arreglo_2d)
# Salida:
# [
# [1, 20, 3],
# [4, 5, 6],
# [7, 8, 9]]
Recorrer un Arreglo de Dos Dimensiones
Recorrer un arreglo de dos dimensiones se utiliza bucles anidados.
# Recorrer e imprimir todos los elementos
for fila in arreglo_2d:
for elemento in fila:
print(elemento, end=' ')
print()
Ejemplo Completo
Este es un ejemplo completo que incluye la creación, acceso, modificación y recorrido de un arreglo de dos dimensiones:
# Crear un arreglo de 3x3
arreglo_2d = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Acceder a un elemento
elemento = arreglo_2d[1][2]
print(f"Elemento en la fila 1, columna 2: {elemento}")
# Modificar un elemento
arreglo_2d[0][1] = 20
print("Arreglo después de la modificación:")
for fila in arreglo_2d:
print(fila)
# Recorrer e imprimir todos los elementos
print("Recorrer e imprimir todos los elementos:")
for fila in arreglo_2d:
for elemento in fila:
print(elemento, end=' ')
print()
Uso de Bibliotecas
Para operaciones más avanzadas con arreglos de dos dimensiones, se utiliza bibliotecas como NumPy, que proporciona una implementación eficiente y funciones adicionales para trabajar con matrices.
import numpy as np
# Crear un arreglo de 3x3 usando NumPy
arreglo_2d = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# Acceder a un elemento
elemento = arreglo_2d[1, 2]
print(f"Elemento en la fila 1, columna 2: {elemento}")
# Modificar un elemento
arreglo_2d[0, 1] = 20
print("Arreglo después de la modificación:")
print(arreglo_2d)
Listas Dentro de Listas
En Python, las listas dentro de listas, también conocidas como listas anidadas, son una forma poderosa de organizar datos en una estructura de dos o más dimensiones. Esto es especialmente útil para representar matrices, tablas, o cualquier otra estructura de datos jerárquica.
Creación de Listas Anidadas
Se puede crear una lista anidada inicializando una lista que contiene otras listas. Por ejemplo:
# Crear una lista anidada de 3x3
lista_anidada = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
Acceso a Elementos
Para acceder a un elemento específico en una lista anidada, se necesita proporcionar los índices correspondientes.
# Acceder al elemento en la lista 1, elemento 2 (índice 0-based)
elemento = lista_anidada[1][2] # Salida: 6
print(elemento)
Modificación de Elementos
Para modificar un elemento específico se proporcionan los índices correspondientes.
# Modificar el elemento en la fila 0, columna 1
lista_anidada[0][1] = 20
print(lista_anidada)
# Salida:
# [
# [1, 20, 3],
# [4, 5, 6],
# [7, 8, 9]]
Recorrer una Lista Anidada
Se puede recorrer una lista anidada utilizando bucles anidados.
# Recorrer e imprimir todos los elementos
for fila in lista_anidada:
for elemento in fila:
print(elemento, end=' ')
print()
Ejemplo Completo
Este ejemplo completo incluye la creación, acceso, modificación y recorrido de una lista anidada:
# Crear una lista anidada de 3x3
lista_anidada = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
# Acceder a un elemento
elemento = lista_anidada[1][2]
print(f"Elemento en la fila 1, columna 2: {elemento}")
# Modificar un elemento
lista_anidada[0][1] = 20
print("Lista después de la modificación:")
for fila in lista_anidada:
print(fila)
# Recorrer e imprimir todos los elementos
print("Recorrer e imprimir todos los elementos:")
for fila in lista_anidada:
for elemento in fila:
print(elemento, end=' ')
print()
Uso de Listas Anidadas en Funciones
Se puede pasar listas anidadas a funciones y manipularlas dentro de ellas.
def imprimir_lista_anidada(lista):
for fila in lista:
for elemento in fila:
print(elemento, end=' ')
print()
# Llamar a la función
imprimir_lista_anidada(lista_anidada)
Listas Anidadas de Más de Dos Dimensiones
También se puede crear listas anidadas de más de dos dimensiones. Por ejemplo, una lista de tres dimensiones:
# Crear una lista anidada de 2x2x2
lista_3d = [
[
[1, 2],
[3, 4]
],
[
[5, 6],
[7, 8]
]
]
# Acceder a un elemento en la tercera dimensión
elemento = lista_3d[1][0][1] # Salida: 6
print(elemento)
Otras Funciones
Longitud
La función len()
en Python se utiliza para obtener la longitud de una lista, es decir, la cantidad de elementos que contiene. Su uso es muy sencillo:
mi_lista = [1, 2, 3, 4, 5]
longitud = len(mi_lista)
print(longitud) # Salida: 5
Operadores de Pertenencia
En Python, los operadores in
y not in
se utilizan para verificar la presencia o ausencia de un elemento en una secuencia o colección. Estos operadores son muy útiles para realizar comprobaciones rápidas y claras sobre la existencia de elementos en listas, tuplas, cadenas, conjuntos y diccionarios.
Operador in
El operador in
se utiliza para verificar si un valor específico está presente en una secuencia o colección. Devuelve True
si el valor está presente y False
si no lo está.
mi_lista = [1, 2, 3, 4]
print(3 in mi_lista) # Salida: True
print(5 in mi_lista) # Salida: False
Operador not in
El operador not in
se utiliza para verificar si un valor específico no está presente en una secuencia o colección. Devuelve True
si el valor no está presente y False
si lo está.
mi_lista = [1, 2, 3, 4]
print(5 in mi_lista) # Salida: True
print(3 in mi_lista) # Salida: False
comprensión de Listas
La comprensión de listas en Python es una técnica concisa y eficiente para crear nuevas listas a partir de iterables existentes, como listas, tuplas o cadenas, aplicando condiciones o transformaciones en una sola línea de código.
Sintaxis básica:
nueva_lista = [expresion for elemento in iterable]
-
expresion
: Operación o valor que se agrega a la nueva lista. -
for elemento in iterable
: Ciclo que recorre el iterable (como una lista o rango).
Ejemplos básicos:
- Crear una nueva lista:
numeros = [1, 2, 3, 4, 5] cuadrados = [x**2 for x in numeros] print(cuadrados) # Salida: [1, 4, 9, 16, 25]
- Filtrar elementos:
numeros = [1, 2, 3, 4, 5, 6] pares = [x for x in numeros if x % 2 == 0] print(pares) # Salida: [2, 4, 6]
- Transformar cadenas:
palabras = ["hola", "mundo", "python"] mayusculas = [palabra.upper() for palabra in palabras] print(mayusculas) # Salida: ['HOLA', 'MUNDO', 'PYTHON']