Saltar al contenido principal

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]