Listas en Python
¿Qué es una lista?
Una lista es una estructura de datos que permite almacenar múltiples elementos en una sola variable.
Tiene las siguientes características:
- Ordenada: los elementos mantienen el orden en el que fueron insertados.
- Mutable: puede modificarse después de su creación.
- Duplicados: permite que haya duplicados.
El símbolo que las caracteriza son los corchetes [ ].
nombres = ["Maria", "Eric", "Nuria"]
edades = [12, 3, 44, 32, 4]
elementos = [12, 3.445, "banana", True, False, 22, "huevos"]
Podemos observar que los elementos de la lista pueden ser de diferentes tipos de datos en una misma lista.
Creación de listas
Método 1
Uso de corchetes [ ] (el más común).
lista_vacia = []
colores = ["rojo", "verde", "azul"]
Método 2
Uso del constructor list().
lista1 = list() # Lista vacía
lista2 = list("Python") # ['P', 'y', 't', 'h', 'o', 'n']
lista3 = list(range(5)) # [0, 1, 2, 3, 4]
Acceso a sus elementos
Para acceder a los elementos de la lista utilizamos su posición. En una lista los índices de posición empiezan desde el 0.
Por lo tanto en la lista nombres = ["Maria", "Eric", "Nuria"], "Maria" estaría en el índice 0 y "Nuria" en el índice 2.
Ls sintaxtis es lista[indice].
Si utilizamos índice positivos (0, 1, 2, 3, 4, ...) leemos de izquierda a derecha.
frutas = ["manzana", "caramelos", "cereza", "alcachofa"]
print(frutas[0]) # "manzana" - primer elemento
print(frutas[2]) # "cereza" - tercer elemento
También podemos utilizar índices negativos, que simplemente recorren la lista de derecha a izquierda, siendo la posición -1 el último, la -2 el penúltimo, etc.
print(frutas[-1]) # "alcachofa" - último elemento
print(frutas[-2]) # "cereza" - penúltimo elemento
Slicing
El término slicing hace referencia a "cortar" una lista a trozos.
Al igual que para acceder a un elemento en concreto (caso anterior), para el slicing también utilizamos los corchetes [ ]. Dentro de estos podemos poner hasta 3 elementos separados por :.
La sintaxis es lista[inicio:fin:intervalo]. La lista se troceará desde la posición de inicio hasta la posición anterior a fin, por defecto aumentando de 1 en 1 a no ser que se indique otro número en intervalo.
numeros = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numeros[2:5]) # [2, 3, 4] - del índice 2 al 4
print(numeros[2:9:2]) # [2, 4, 6, 8] - del 2 al 8 de 2 en 2
Además, si no indicamos ningún número en concreto en inicio y fin se entiende que es desde el principio o hasta el final respectivamente. Por ejemplo:
print(numeros[:4]) # [0, 1, 2, 3] - primeros 4 elementos
print(numeros[5:]) # [5, 6, 7, 8, 9] - desde índice 5 hasta el final
print(numeros[::2]) # [0, 2, 4, 6, 8] - desde el inicio hasta el final cada 2 elementos
Por otro lado, si queremos recorrer la lista del revés, hemos de añadir en el hueco del intervalo un -1.
print(numeros[8:2]) # esto NO funcionaría
print(numeros[8:1:-1]) # [8, 6, 4, 2]
Añadir elementos a una lista
La manera más común de agragar elementos a una lista es mediante la función append(). Entre los paréntesis ( ) debemos indicar el elemento que queremos añadir.
Esta función sigue la sintaxis lista.append(nuevo_elemento), y añade el elemento al final de la lista.
ciudades = ["VLC", "BCN"]
ciudades.append("MAD")
print(ciudades) # ["VLC", "BCN", "MAD"]
Otro método para añadir elementos a una lista el con el insert(), cuya sintaxis es lista.insert(pos, elemento). A diferencia del append(), en este método se puede indicar el índice de la posición donde queremos que se inserte.
ciudades.insert(1, "SEV") # inserta SEV en la segunda posición (1)
print(ciudades) # ["VLC", "SEV", "BCN", "MAD"]
Por último, existe también el método extends(), que permite agregar más de un elemento a la vez al final de la lista.
ciudades.extends(["CAS", "LUG"])
print(ciudades) # ["VLC", "SEV", "BCN", "MAD", "CAS", "LUG"]
Eliminar elementos
Para eliminar elementos existen 3 métodos diferentes:
remove(elem), que elimina un elemento en concreto.pop(indice), que elimina el elemento del índice y lo devuelve.clear(), vacía toda la lista.
ciudades = ["VLC", "SEV", "BCN", "MAD", "CAS", "LUG"]
# pop() - elimina por índice y devuelve valor
eliminado = ciudades.pop(2) # elimina el 3r elemento
print(eliminado) # BCN
# ciudades = ["VLC", "SEV", "MAD", "CAS", "LUG"]
# remove() - elimina por valor
ciudades.remove("VLC")
# ciudades = ["SEV", "MAD", "CAS", "LUG"]
# clear() - vacía la lista completa
ciudades.clear()
# ciudades = VLC", "SEV", "MAD", "CAS", "LUG"]
Otros métodos
Longitud de la lista
El método len(lista) devuelve cuántos elementos tiene la lista.
lista = [5, 2, 8, 2, 1]
# Longitud de la lista
print(len(lista)) # 5
Contar ocurrencias
El método count(elem) devuelve cuántas veces aparece el elemento en la lista.
nombres = ["M", "R", "M", "J", "M", "I"]
print(nombres.count("M")) # 3 veces
Consultar índice
El método index(elem) devuelve la posición del elemento en la lista (su índice).
nombres = ["M", "R", "M", "J", "M", "I"]
print(lista.index("J")) # 3
Ejercicio
Calcula el promedio de una lista de notas. notas = [5,6,7,10,9,6.5].
PISTA: la función sum() suma el valor de los elementos de una lista.
# Solución
notas = [5, 6, 7, 10, 9, 6.5]
promedio = sum(notas) / len(notas)
print("Promedio:", promedio)
Bucles for en listas
Para recorrer los elementos de una lista y acceder a todos ellos uno a uno utilizamos un bucle cuya estructura es:
for elemento in lista:
# codigo
Por ejemplo:
nombres = ["Maria", "Eric", "Paula"]
for n in nombres:
print(n)
# Resultado:
# Maria
# Eric
# Paula
Observamos que la variable iteradora equivale a cada uno de los elementos por separado.
Veamos un ejemplo un poco más complejo, donde sin utilizar sum() sumamos todos los elementos de una lista:
numeros = [2,3,4,1,5]
suma = 0 # inicializamos el contador de la suma
for i in numeros: # i equivale a los elementos de la lista uno a uno
suma += i # añadimos el elemento al contador
print(suma) # 15
Condicionales en listas
Para comprobar si un elemento está en una lista podemos utilizar la estructura if elemento in lista.
nombres = ["Maria", "Eric", "Paula"]
if "Maria" in nombres:
print("Maria está en la lista")
else:
print("Maria no está en la lista")
Probemos a combinar un for con un if.
Imaginemos que tenemos dos listas de personas lista1 = ["Maria", "Jose", "Teresa", "Juan"] y lista2 = ["Marta", "Maria", "Bernardo", "Jose", "Eric"]. Queremos saber quienes están en ambas listas.
En problemas donde queremos ver qué elementos son comunes a dos listas simplemente recorreremos una de ellas con un for y comprobaremos con la estructura if ... in ... si está en la otra.
lista1 = ["Maria", "Jose", "Teresa", "Juan"]
lista2 = ["Marta", "Maria", "Bernardo", "Jose", "Eric"]
for persona in lista1: # recorremos todas las personas de la primera lista
if persona in lista2: # si esa persona también está en la segunda lista
print(persona, 'está en ambas listas')
# Resultado:
# Maria está en ambas listas
# Jose está en ambas listas
Ejercicios
1. Numeros pares
Dada una lista numeros = [1,3,4,2,5,6,77,82,3] devuelve otra lista solo con los números pares.
PISTA: un número es par si al dividirlo entre 2 su resto es 0.
numeros = [1,3,4,2,5,6,77,82,3]
pares = [] # si o si me debo inicializar la lista solución vacía
for n in numeros:
if n % 2 == 0: # si es par
pares.append(n) # lo añado a la solución
print(pares) # [4, 5, 6, 82]
2. Palabras lagas
Dada una lista de palabras palabras = ["sol", "computadora", "libro", "programación", "luz"] devuelve cuántas de ellas tienen menos de 4 letras.
PISTA: len(palabra) devuelve cuántas letras tiene.
palabras = ["sol", "computadora", "libro", "programación", "luz"]
contador = 0 # inicializo el contador de palabras cortas a 0
for p in palabras:
if len(p) < 4: # si esa palabra tiene menos de 4 letras
contador += 1 # sumo 1 la solución, ya que he concontrado una palabra más con esa condición
print(contador) # 2
3. Palabras lagas
Dada una lista de edades edades = [15, 25, 42, 70, 17, 38, 22] devuelve 4 listas diferentes según esta condición:
- Niño: < 18
- Joven: 18-35
- Adulto: 36-60
- Mayor: > 60
edades = [15, 25, 42, 70, 17, 38, 22]
# inicializo todas las listas de la solución
ninos = []
jovenes = []
adultos = []
mayores = []
# recorro todas las edades
for edad in edades:
if edad < 18:
ninos.append(edad)
elif edad <= 35:
jovenes.append(edad)
elif edad <= 60:
adultos.append(edad)
else:
mayores.append(edad)
# Solución:
# ninos = [15, 17]
# jovenes = [25, 22]
# adultos = [42, 38]
# mayoes = [70]