Listas en Python

Última actualización: noviembre 2024

Las listas en Python son estructuras de datos que guardan una colección de elementos que pueden ser de distinto tipo (cadenas, números, …). Estos elementos se presentan dentro de corchetes [ ] separados por comas. Un ejemplo sería el siguiente

lista=[2,"Cadiz",True,25.7]
print(type(lista))

Este código arrojaría el siguiente resultado:

<class 'list'>

que nos muestra que la variable de nombre lista que acabamos de crear es tipo ‘list’

Vamos a ver ahora algunas de las acciones más habituales con listas.

funcion len()

Nos devuelve la longitud de una lista, es decir, el número de elementos que tiene.

lista=[2,"Cadiz",True,25.7]
numElementos=len(lista)
print(f"La longitud de la lista es {numElementos}")

Resultado:

La longitud de la lista es 4

Generar una lista vacia

Sencillamente no incluimos ningún elemento cuando la creamos.

lista=[]

También podemos vaciar una lista empleando la función clear( )

numeros=[1,3,5,7,9]
print("lista numeros",numeros)
numeros.clear()
print("lista numeros",numeros)

Resultado:

lista numeros [1, 3, 5, 7, 9]
lista numeros []

Accediendo a los elementos de una lista

Podemos acceder a un elemento concreto de la lista, a través de su índice. Los índices comienzan en cero

lista=[2,"Cadiz",True,25.7]
print(f"el primer elemento de la lista es {lista[0]}")
print(f"el tercer elemento de la lista es {lista[2]}")

Resultado:

el primer elemento de la lista es 2
el tercer elemento de la lista es True

Podemos recorrer la lista empezando por el final, empleando índices negativos. Para -1 recuperamos el último elemento, para -2 el penultimo y así sucesivamente.

lista=[2,"Cadiz",True,25.7]
print(f"el ultimo elemento de la lista es {lista[-1]}")
print(f"el penultimo elemento de la lista es {lista[-2]}")

Y el resultado sería:

el ultimo elemento de la lista es 25.7
el penultimo elemento de la lista es True

Es posible recuperar también un rango de elementos, indicando los índices de los extremos separados por dos puntos [elemento_inicial:elemento_final] (no recupera el último elemento)

lista=[2,"Cadiz",True,25.7]
trozo=lista[1:3]
print(trozo)

Resultado:

['Cadiz', True]

Si queremos extraer un fragmento desde el principio hasta una posición, dejamos el índice del extremo inicial vacio y indicamos hasta que índice queremos recuperar en el extremo final (recordar este último elemento no se incluye). Y al contrario, si quisiéramos obtener un fragmento desde una posición hasta el final de la lista, indicamos en el extremo inicial el índice del elemento que inicia el fragmento y dejamos vacio el elemento final:

lista=[2,"Cadiz",True,25.7]
fragmento1=lista[:3]
fragmento2=lista[1:]
print("fragmento1= ",fragmento1)
print("fragmento2= ",fragmento2)

Resultado:

fragmento1=  [2, 'Cadiz', True]
fragmento2=  ['Cadiz', True, 25.7]

Comprobando si un elemento está en una lista

Para comprobar si un elemento está incluido en una lista, empleamos el operador in. El primer operando es el elemento que queremos comprobar si está en la lista y el segundo es la lista. La operación devuelve un booleano:True/False

lista=["Cadiz","Sevilla","Cordoba","Madrid","Leon","Gijon"]
ciudad="Cadiz"
if(ciudad in lista):
    print(f"{ciudad} está en la lista")
else:
    print(f"{ciudad} no está en la lista")

Resultado:

Cadiz está en la lista

count (<elemento>): Utilizando la función count(<elemento>) podemos saber el número de veces que aparece un elemento en una lista. Sencillamente le pasamos el valor de dicho elemento y la función count(<elemento>) devuelve el número de veces que aparece en la lista.

lista=["Cadiz","Sevilla","Cadiz","Madrid"]
ciudad="Cadiz"
veces= lista.count(ciudad)
print(f"{ciudad} aparece {veces} veces en la lista")

Resultado:

Cadiz aparece 2 veces en la lista

Modificando los elementos de una lista

Las variables de tipo lista son mutables, lo cual quiere decir que se pueden modificar. Además, una lista, admite valores repetidos. Podemos cambiar el valor de un elemento de una lista accediendo a él a través del índice.

lista=["Cadiz","Sevilla","Cordoba","Madrid"]
indice=2
print(lista[indice])
lista[2]="Gijon"
print(lista[indice])

Y el resultado:

Cordoba
Gijon

Borrar elementos de una lista

Podemos borrar el elemento indicando su posición o por su valor.

Para borrar indicando su posición, tenemos dos funciones: del y pop

  • del(posición): borra el elemento y no devuelve nada
lista=["Cadiz","Sevilla","Cordoba","Madrid"]
indice=1
del(lista[indice])
print(lista)

Resultado:

['Cadiz', 'Cordoba', 'Madrid']
  • pop(posición): borra el elemento y devuelve el elemento borrado.
lista=["Cadiz","Sevilla","Cordoba","Madrid"]
print(f"lista inicial: {lista}")
indice=1
ciudad_borrada=(lista.pop(indice))
print(f"Ciudad eliminada: {ciudad_borrada}")
print(f"nueva lista {lista}")

Resultado:

lista inicial: ['Cadiz', 'Sevilla', 'Cordoba', 'Madrid']
Ciudad eliminada: Sevilla
nueva lista ['Cadiz', 'Cordoba', 'Madrid']

Si usamos pop() sin indicar índice, borraremos el último elemento de la lista, que equivale al último elemento introducido, como si fuera una pila, el que está en lo más alto.

lista=["Cadiz","Sevilla","Cordoba","Madrid"]
print(f"lista inicial: {lista}")
ciudad_borrada=(lista.pop())
print(f"Ciudad eliminada: {ciudad_borrada}")
print(f"nueva lista {lista}")

Resultado:

lista inicial: ['Cadiz', 'Sevilla', 'Cordoba', 'Madrid']
Ciudad eliminada: Madrid
nueva lista ['Cadiz', 'Sevilla', 'Cordoba']

Por otro lado, para borrar un elemento de una lista por su valor, usamos la función remove(valor).

  • remove(valor): Eliminamos la primera aparición del elemento
lista=["Cadiz","Sevilla","Cordoba","Madrid","Cadiz","Merida"]
print(f"lista inicial: {lista}")
lista.remove("Cadiz")
print(f"nueva lista {lista}")

Resultado:

lista inicial: ['Cadiz', 'Sevilla', 'Cordoba', 'Madrid', 'Cadiz', 'Merida']
nueva lista ['Sevilla', 'Cordoba', 'Madrid', 'Cadiz', 'Merida']

La función remove sólo elimina la primera aparición del elemento, con lo que tendremos que usar un bucle while para eliminarlos todas las apariciones del valor, mientras exista el valor en la lista.

lista=["Cadiz","Sevilla","Cordoba","Madrid","Cadiz","Merida","Cadiz"]
print(f"lista inicial: {lista}")
borrar_ciudad="Cadiz"
while (borrar_ciudad in lista):
    lista.remove(borrar_ciudad)
print(f"nueva lista {lista}")

Resultado:

lista inicial: ['Cadiz', 'Sevilla', 'Cordoba', 'Madrid', 'Cadiz', 'Merida', 'Cadiz']
nueva lista ['Sevilla', 'Cordoba', 'Madrid', 'Merida']

Añadir elementos a una lista

  • append( ): Con esta función añadimos un elemento al final de la lista, pasando como parámetro el elemento que queremos añadir.
lista=["Cadiz","Sevilla","Cordoba"]
print(f"lista inicial: {lista}")
lista.append(5)
lista.append("Madrid")
print(f"nueva lista {lista}")

Resultado:

lista inicial: ['Cadiz', 'Sevilla', 'Cordoba']
nueva lista ['Cadiz', 'Sevilla', 'Cordoba', 5, 'Madrid']

Recordemos que los elementos de una lista pueden ser de distinto tipo

  • insert( <posicion>,<elemento> ): inserta el elemento <elemento> en la posición <posición>
lista=["Cadiz","Sevilla","Cordoba"]
print(f"lista inicial: {lista}")
lista.insert(2,"Puerto de Santa Maria")
print(f"nueva lista {lista}")

Resultado:

lista inicial: ['Cadiz', 'Sevilla', 'Cordoba']
nueva lista ['Cadiz', 'Sevilla', 'Puerto de Santa Maria', 'Cordoba']
  • extend(<list>): añade al final de una lista, los elementos de la lista que se le pase como parámetro.
lista=["Cadiz","Sevilla","Cadiz","Madrid"]
añadidos=["Gijon","Leon","Pontevedra"]
lista.extend(añadidos)
print(lista)

Resultado:

['Cadiz', 'Sevilla', 'Cadiz', 'Madrid', 'Gijon', 'Leon', 'Pontevedra']

Ordenar los elementos de una lista

  • sorted(<lista>): La función sorted( ) nos permite ordenar los elementos de una lista que le pasemos como parámetro. Con el parámetro reverse, podemos indicar si queremos ordenar en orden descendente.
ciudades=["Cadiz","Sevilla","Cordoba","Gijon","Bilbao","Santander"]
ciudades_ordenAscendente=sorted(ciudades)
ciudades_ordenDescendente=sorted(ciudades,reverse=True)
print("--Lista inicial:---")
print(ciudades)
print("--Lista ordenada en orden ascendente:---")
print(ciudades_ordenAscendente)
print("--Lista ordenada en orden descendente:---")
print(ciudades_ordenDescendente)

Resultado:

--Lista inicial:---
['Cadiz', 'Sevilla', 'Cordoba', 'Gijon', 'Bilbao', 'Santander']
--Lista ordenada en orden ascendente:---
['Bilbao', 'Cadiz', 'Cordoba', 'Gijon', 'Santander', 'Sevilla']
--Lista ordenada en orden descendente:---
['Sevilla', 'Santander', 'Gijon', 'Cordoba', 'Cadiz', 'Bilbao']

Obviamente, también funciona con números

Además. disponemos de la función reverse( ) que nos permite invertir el orden de los elementos en la lista: El último pasaría a ser el primero, el penúltimo el segundo y así sucesivamente. No hay que confundir el método reverse( ) con el parámetro reverse que empleábamos en el método sorted( )

numeros=[1,3,5,7,9]
print("lista numeros",numeros)
numeros.reverse()
print("lista numeros",numeros)

Resultado

lista numeros [1, 3, 5, 7, 9]
lista numeros [9, 7, 5, 3, 1]

Anidar listas en listas

Los elementos de una lista pueden ser cualquier tipo de objeto, y eso incluye otra lista.

sur=["Cadiz","Sevilla","Cordoba"]
norte=["Gijon","Bilbao","Santander"]
ciudades=[sur,norte,["Madrid","Caceres","Toledo"]]
print(f"ciudades: {ciudades}")

Resultados:

ciudades: [['Cadiz', 'Sevilla', 'Cordoba'], ['Gijon', 'Bilbao', 'Santander'], ['Madrid', 'Caceres', 'Toledo']]

Para acceder a un elemento de una lista incluida en otra lista, accedo a través de los índices de forma jerárquica: primero el índice de la posición de la lista incluida y después el índice del elemento en la lista incluida.

Empleando el ejemplo anterior, para acceder al elemento “Gijon”, primero indicamos el índice de la posición que ocupa la lista dentro de la lista principal (segundo elemento: índice =1) y luego indicamos el índice de la posición que ocupa el elemento en la lista incluida (primer elemento: índice=0)

sur=["Cadiz","Sevilla","Cordoba"]
norte=["Gijon","Bilbao","Santander"]
ciudades=[sur,norte,["Madrid","Caceres","Toledo"]]
ciudad=ciudades[1][0]
print(f"ciudad: {ciudad}")

Resultado:

ciudad: Gijon

Copiar listas

Existen diferentes formas de asignar los valores de una lista a otra. Si empleamos una asignación, el resultado es que ambas listas referencian el mismo objeto y al modificar una, modificamos la otra.

lista1=[1,3,5,7,9,11]
print(f"El primer elemento de lista1 es {lista1[0]}")
lista2=lista1
lista2[0]=0
print(f"El primer elemento de lista1 es {lista1[0]}")

Resultado:

El primer elemento de lista1 es 1
El primer elemento de lista1 es 0

Para asignar los valores de una lista a otra y que sean dos objetos independientes, empleamos el método copy. En el ejemplo siguiente, se copia lista1 en lista2, y las modificaciones que hagamos sobre la última no afectan a la primera.

lista1=[1,3,5,7,9,11]
print(f"El primer elemento de lista1 es {lista1[0]}")
lista2=lista1.copy( )
lista2[0]=0
print(f"El primer elemento de lista1 es {lista1[0]}")

Resultado:

El primer elemento de lista1 es 1
El primer elemento de lista1 es 1

También podríamos utilizar índices para copiar un conjunto de elementos de una lista a otra. Sencillamente seleccionamos el rango de elementos que queramos copiar indicando los indices de principio y fin (recuerda que python no incluye el indice final del rango). Por ejemplo, el siguiente código copia los elementos desde la segunda posición (indice 1) a la cuarta (indice 3).

lista1=[1,3,5,7,9,11]
print(f"lista1 es :{lista1}")
lista2=lista1[1:4]
print(f"lista2 es {lista2}")

El resultado:

lista1 es :[1, 3, 5, 7, 9, 11]
lista2 es [3, 5, 7]

e indicando todos los indices podríamos copiar la lista entera

lista2=lista1[:]

Funciones en listas de numeros

Hay algunas funciones muy útiles cuando nuestra lista es de números:

  • min(lista): devuelve el valor mínimo
  • max (lista): devuelve el valor máximo
  • sum (lista): devuelve la suma de los elementos de la lista
numeros=[1,3,5,7,9]
print("valor minimo",min(numeros))
print("valor maximo",max(numeros))
print("suma de todos los numeros ",sum(numeros))

Resultado:

valor minimo 1
valor maximo 9
suma de todos los numeros  25

Emplearemos las listas cuando trabajemos con conjuntos de datos que se puedan repetir y que tengamos que modificar

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Introducción a Python

Última actualización: septiembre 2024

Python es uno de los lenguajes de programación más extendidos y que más está creciendo, empleado en multitud de campos como el análisis de datos, la inteligencia artificial o el desarrollo de juegos.

Es además un software libre administrado por Phyton Software Foundation: www.python.org

Versiones Python

Actualmente se mantienen dos versiones de Python en paralelo:

  • Versiones 2.x (desde el año 2.000)
  • Versiones 3.x (en paralelo con 2.x desde 2.008)

Existen algunas diferencias notables entre la versión 3 y la 2. En este curso, nos centraremos en la versión 3, la versión 2 está prácticamente en desuso.

Vamos a trabajar con la versión 3.11, que es la más actual que aparece como segura desde el punto de vista de mantenimiento:

Estado de las distintas versiones de Python (septiembre 2024)

Características y ventajas principales

Phyton tiene importantes ventajas sobre otros lenguajes:

  • Es de propósito general.
  • Interpretado.
  • Tipado dinámico.
  • Open source.
  • Lenguaje multiparadigma: procedural, funcional, POO.
  • Multiplataforma: Linux, Windows, OSX.
  • Python busca: simplicidad, elegancia y legibilidad.
  • Gran comunidad de usuarios.
  • Es el lenguaje que más rápido ha crecido en los últimos años por delante de lenguajes como Javascript, Java, PHP, C++

Cuando empiezas a programar con Python es habitual que te llegue información del PEP 20, que es la «filosofía» empleada en el diseño de este lenguaje de programación. Los principios de esta filosofía, conocida como el Zen de Python, fueron declarados por Tim Peters, el creador de la primera versión de Python: CPython.

A mi modo de ver es recomendable dedicar unos minutos a leer estos principios antes de sumergirse en la tarea de aprender Python, según vayamos aprendiendo el lenguaje iremos apreciando la implementación de estos principios. Por ello te reproduzco aquí los principios del Zen de Python:

El Zen de Python, por Tim Peters

Lo bonito es mejor que lo feo.
Lo explícito es mejor que lo implícito.
Lo simple es mejor que lo complejo.
Lo complejo es mejor que lo complicado.
Lo plano es mejor que lo anidado.
Lo disperso es mejor que lo denso.
La legibilidad cuenta.
Los casos especiales no son lo suficientemente especiales como para romper las reglas.
Aunque la practicidad vence a la pureza.
Los errores nunca deben pasar en silencio.
A menos que se silencien explícitamente.
En caso de ambigüedad, rechaza la tentación de adivinar.
Debería haber una, y preferiblemente solo una, forma obvia de hacerlo.
Aunque esa forma puede no ser obvia al principio, a menos que seas holandés.
Ahora es mejor que nunca.
Aunque nunca es mejor que *ahora mismo*.
Si la implementación es difícil de explicar, es una mala idea.
Si la implementación es fácil de explicar, puede que sea una buena idea.
Los espacios de nombres son una gran idea, ¡hagamos más de ellos!

Si quiere leer un poco más de este tema, puedes echar un ojo a este post.

Instalando Python

Obviamente, antes de empezar a trabajar con Python, lo primero que tenemos que hacer es instalarlo en nuestro ordenador. La instalación es distinta dependiendo del sistema operativo que empleemos.

Pero antes de lanzarte a instalar Python, mi recomendación es que mejor te instales el paquete Anaconda, que además de Python incluye herramientas muy útiles para trabajar con este lenguaje de programación. Si vas a instalarte Anaconda directamente, pasa a la sección de Instalando Anaconda.

Instalación en Windows

Es posible que ya tengamos instalado Python porque lo hayamos hecho con alguna aplicación, así es que empezaremos por comprobar si ya lo tenemos instalado. Para ello abrimos una ventana de comandos (tecleamos cmd en la ventana de aplicaciones) e introducimos el comando:

python --version

Si lo tenemos instalado, veremos la versión de Python que tenemos instalada:

C:\ProgramData\anaconda3>python --version
Python 3.12.4

Posteriormente, cuando trabajemos en proyectos y nos creemos un entorno específico para cada proyecto, veremos que podemos instalar la versión del interprete que queramos para ese proyecto.

Si NO lo tenemos instalado, veremos algo similar a:

C:\Users\Jegarcia>python - -version
No se encontr¾ Python; ejecuta sin argumentos para instalar desde Microsoft Store o deshabilita este acceso directo en Configuraci¾n > Administrar alias de ejecuci¾n de la aplicaci¾n.

Aunque también puede ocurrir que no tengamos la ruta de Python en la variable de entorno Path, por lo que para ejecutar Python tendríamos que colocarnos en la carpeta donde estuviera el ejecutable.

Si no lo tenemos instalado y tecleamos directamente «Python» en la ventana de la consola. Dependiendo de la versión de Windows, es posible que te dirija a Microsoft Store y te permita obtenerlo desde ahí:

Descarga de Python 3.12 desde Microsoft Store
Descarga de Python desde Microsoft Store

También podemos ir a descargarlo directamente desde la web oficial: downloads

Descarga de Python desde la web Oficial (septiembre 2024)

Las versiones de Python tienen tres valores separados por puntos. El primero indica la versión principal, el segundo una versión secundaria y el tercero la versión micro. En este caso, lo importante es que trabajemos con la versión principal 3, ya que hay diferencias notables con la versión principal 2. Idealmente iremos a la última versión en estado: “security”, lo que indica que la versión está segura, que en nuestro caso es 3.11 (septiembre 2024)

Ahora procederíamos a instalarlo y una vez instalado, comprobamos en una ventana de comandos la versión instalada, como indicaba al principio de este apartado.

Con Python ya instalado, lo único que necesitaríamos hacer es instalarnos un IDE de nuestra elección para empezar a programar. Algunos de los más utilizados con Python son: Jupyter Notebook, Visual Studio Code y Spyder.

Instalando Anaconda

No obstante, Python es un lenguaje de propósito general que tiene múltiples campos de aplicación: ciencia en datos, aprendizaje automático, etc, para los que emplearíamos otras aplicaciones y librerías. Por ello, nos puede resultar más interesante instalarnos una distribución de Python que incluya varias de estas herramientas. La más popular sin duda es Anaconda.

Herramientas disponibles en el repositorio Anaconda

Podemos descargar Anaconda desde el repositorio oficial: descarga Anaconda

Nos descargamos Anaconda y así además de Spyder, tenemos Jupyter, pero también un montón de librerías que emplearemos luego en ciencia en datos, como Numpy, Pytorch, pandas y matplotlib. Además, tendríamos tensorFlow por si trabajamos con IA.

Anaconda provee distintos instaladores para los distintos Sistemas Operativos con los que trabajemos. Todos ellos de sencilla instalación, en la que seguiríamos las indicaciones del instalador para realizar la instalación recomendada.

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.