Diccionarios en Python

Última actualización: Noviembre 2024

Los diccionarios en Python son fundamentales porque nos permiten almacenar y gestionar datos de manera eficiente mediante pares clave-valor. A diferencia de las listas, que están indexadas por posición, los diccionarios permiten acceder a los datos de manera directa utilizando claves descriptivas, lo que mejora la legibilidad y el mantenimiento del código. Además, tienen una correspondencia directa con el formato json que usaremos habitualmente.

Los diccionarios se representan entre llaves { } , almacenando las parejas clave-valor separadas por comas. Para definir cada pareja, primero se indica la clave entre comillas (simples o dobles), seguida de dos puntos y el valor que se asocia a la clave.

diccionario={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
print(type(diccionario))

Si ejecutamos el programa comprobamos que nuestra colección es del tipo diccionario:

<class 'dict'>

Los valores del diccionario pueden ser diferentes tipos de objetos (cadenas, números, colecciones..).

Acceder a los valores de un diccionario

Los corchetes sirven para acceder a un valor del diccionario mediante la clave.

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
nombre=cliente_1["nombre"]
print(nombre)

Resultado:

Juan

Modificar valores de un diccionario

Los diccionarios son mutables y puedo modificar el valor de una clave, accediendo a través de la citada clave:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
cliente_1["nombre"]="Antonio"
nombre=cliente_1["nombre"]
print(nombre)

Resultado:

Antonio

Añadir elementos a un diccionario

En un diccionario ya existente podemos añadir un nuevo elemento (“clave”:valor), sencillamente dándole un valor a la nueva clave

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
cliente_1["tfno"]=620185477
print(cliente_1)

Resultado:

{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'eda': 37, 'dirección': 'Calle Rue del Percebe, nº4', 'tfno': 620185477}

Para cambiar un valor de un diccionario y para añadir un par “clave”:valor, la sintaxis es prácticamente la misma. Únicamente se añade el par si la clave no existe.

Podemos empezar con un diccionario vacío e ir añadiendo elementos. Para definir un diccionario vacío no incluimos ningún elemento: diccionario={ }

cliente_2={}
cliente_2["id_Cliente"]=2
cliente_2["nombre"]="Veronica"
cliente_2["apellidos"]="Martinez Pelaez"
print(cliente_2)

Resultado:

{'id_Cliente': 2, 'nombre': 'Veronica', 'apellidos': 'Martinez Pelaez'}

Eliminar elementos de un diccionario

Podemos eliminar una pareja “clave”:valor con la instrucción del. Indicando la clave

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
             "eda":37,"dirección":"Calle Rue del Percebe, nº4"}
del cliente_1["dirección"]
print(cliente_1)

Resultado:

{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'eda': 37}

Recorrer diccionarios

Podemos recorrer los diccionarios de distintas maneras, empleando las claves, los valores o los elementos.

  • keys( ): método empleado para recorrer el diccionario empleando las claves
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
for clave in cliente_1.keys():
    print(f"para la clave: {clave}, tenemos el valor: {cliente_1[clave]}")

Resultado:

para la clave: id_Cliente, tenemos el valor: 1
para la clave: nombre, tenemos el valor: Juan
para la clave: Apelllidos, tenemos el valor: Garcia Perez
para la clave: eda, tenemos el valor: 37
para la clave: dirección, tenemos el valor: Calle Rue del Percebe, nº4
para la clave: tfno, tenemos el valor: 620185477
  • values( ): método empleado para recorrer el diccionario por los valores
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
for valor in cliente_1.values():
    print(f"el valor es: {valor}")

Resultado:

el valor es: 1
el valor es: Juan
el valor es: Garcia Perez
el valor es: 37
el valor es: Calle Rue del Percebe, nº4
el valor es: 620185477

items( ): con este método, podemos recorrer el diccionario elemento a elemento, recuperando la clave y el valor

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
for clave,valor in cliente_1.items():
    print(f"para la clave: {clave}, tenemos el valor: {valor}")

Resultado:

para la clave: id_Cliente, tenemos el valor: 1
para la clave: nombre, tenemos el valor: Juan
para la clave: Apelllidos, tenemos el valor: Garcia Perez
para la clave: eda, tenemos el valor: 37
para la clave: dirección, tenemos el valor: Calle Rue del Percebe, nº4
para la clave: tfno, tenemos el valor: 620185477

Métodos asociados a los diccionarios

Los diccionarios tienen métodos asociados. En este apartado veremos algunos ejemplos de los más empleado:

  • get( ): Tiene dos argumentos: el primero obligatorio y el segundo opcional. El primero es la clave y el segundo el valor que se devuelve en el caso de que no exista la clave.

Si intentamos acceder a un elemento del diccionario a través de una clave que no existe, obtendremos un error:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1["telefono"]

Resultado:

    telefono=cliente_1["telefono"]
KeyError: 'telefono'

Podemos emplear la función get(), y en el caso de que no exista la clave evitamos que se produzca un error. En el caso de que no empleáramos el segundo argumento opcional:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1.get("telefono")
print(telefono)

Resultado:

None

Y empleando el segundo argumento, obtendríamos ese argumento como valor cuando no exista la clave:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1.get("telefono","Clave no encontrada")
print(telefono)

Resultado:

Clave no encontrada
  • pop( ): Elimina la clave del diccionario pero devuelve el valor
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","eda":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
telefono=cliente_1.pop("tfno")
print(telefono)
print(cliente_1)

Resultado:

620185477
{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'eda': 37, 'dirección': 'Calle Rue del Percebe, nº4'}
  • keys( ): Recupera las claves del diccionario en una colección:
  • values( ): Recupera las claves del diccionario en una colección:
  • items( ): Recupera las claves y valores del diccionario en una colección:
cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","edad":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
print("---------------------------------CLAVES-------------------------")
claves=cliente_1.keys()
print(type(claves))
print(claves)
print("---------------------------------VALORES-----------------------")
valores=cliente_1.values()
print(type(valores))
print(valores)
print("-------------------------------ELEMENTOS--------------------------")
elementos=cliente_1.items()
print(type(elementos))
print(elementos)

Resultado:

---------------------------------CLAVES-------------------------
<class 'dict_keys'>
dict_keys(['id_Cliente', 'nombre', 'Apelllidos', 'edad', 'dirección', 'tfno'])
---------------------------------VALORES-----------------------
<class 'dict_values'>
dict_values([1, 'Juan', 'Garcia Perez', 37, 'Calle Rue del Percebe, nº4', 620185477])
-------------------------------ELEMENTOS--------------------------
<class 'dict_items'>
dict_items([('id_Cliente', 1), ('nombre', 'Juan'), ('Apelllidos', 'Garcia Perez'), ('edad', 37), ('dirección', 'Calle Rue del Percebe, nº4'), ('tfno', 620185477)])

Anidación de diccionarios

Podemos incluir diccionarios en diccionarios, o lo que es lo mismo, un diccionario puede ser un elemento de otro diccionario. En el ejemplo de diccionario de cliente que vengo usando podríamos agrupar nombre y apellidos en un diccionario, ya que normalmente usaremos sus valores juntos. Además, también tendría sentido usar un diccionario para los distintos medios de contacto que tenemos con el cliente.

cliente_1={"id_Cliente":1,
           "nomCompleto":{"nombre":"Juan","Apelllidos":"Garcia Perez"},
           "edad":37,"dirección":"Calle Rue del Percebe, nº4",
           "contactos":{'tfno': 620185477,"email":"juangarpe@gmail.com"}}
for clave,valor in cliente_1.items():
    print(f"para la clave: {clave}, tenemos el valor: {valor}")

Resultado:

para la clave: id_Cliente, tenemos el valor: 1
para la clave: nomCompleto, tenemos el valor: {'nombre': 'Juan', 'Apelllidos': 'Garcia Perez'}
para la clave: edad, tenemos el valor: 37
para la clave: dirección, tenemos el valor: Calle Rue del Percebe, nº4
para la clave: contactos, tenemos el valor: {'tfno': 620185477, 'email': 'juangarpe@gmail.com'}

Combinación de diccionarios con colecciones

La combinación de los diferentes tipos de variables permite generar diferentes tipos de estructuras de datos. Por ejemplo, listas de diccionarios:

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
           "edad":37,"dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
cliente_2={"id_Cliente":2,"nombre":"Pedro","Apelllidos":"Rodriguez Martinez",
           "edad":27,"dirección":"Avenida de Europa, nº4",'tfno': 610281473}
cliente_3={"id_Cliente":3,"nombre":"Fabiola","Apelllidos":"Ruiz Suarez",
           "edad":22,"dirección":"Via ancha es Castilla, nº7",'tfno': 720136189}
lista_clientes=[cliente_1,cliente_2,cliente_3]
for cliente in lista_clientes:
    print(cliente)       

Resultado:

{'id_Cliente': 1, 'nombre': 'Juan', 'Apelllidos': 'Garcia Perez', 'edad': 37, 'dirección': 'Calle Rue del Percebe, nº4', 'tfno': 620185477}
{'id_Cliente': 2, 'nombre': 'Pedro', 'Apelllidos': 'Rodriguez Martinez', 'edad': 27, 'dirección': 'Avenida de Europa, nº4', 'tfno': 610281473}
{'id_Cliente': 3, 'nombre': 'Fabiola', 'Apelllidos': 'Ruiz Suarez', 'edad': 22, 'dirección': 'Via ancha es Castilla, nº7', 'tfno': 720136189}

En estructuras como la anterior, accedemos de forma jerárquica a los elementos. Es decir, primero indicaríamos el elemento de la lista por su índice y luego el elemento del diccionario por su clave

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez",
           "edad":37,"dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
cliente_2={"id_Cliente":2,"nombre":"Pedro","Apelllidos":"Rodriguez Martinez",
           "edad":27,"dirección":"Avenida de Europa, nº4",'tfno': 610281473}
cliente_3={"id_Cliente":3,"nombre":"Fabiola","Apelllidos":"Ruiz Suarez",
           "edad":22,"dirección":"Via ancha es Castilla, nº7",'tfno': 720136189}
lista_clientes=[cliente_1,cliente_2,cliente_3]
nombre_client_2=lista_clientes[1]["nombre"]    
print(nombre_client_2)

Resultado:

Pedro

Conversión de tipos

Para realizar conversiones de tipos entre colecciones, usamos el mismo procedimiento que con las variables simples. Empleamos funciones de nombre igual al tipo al que queremos convertir. Por ejemplo, para convertir a lista, emplearemos la función list( ).

cliente_1={"id_Cliente":1,"nombre":"Juan","Apelllidos":"Garcia Perez","edad":37,
           "dirección":"Calle Rue del Percebe, nº4",'tfno': 620185477}
coleccion=cliente_1.keys()
print(type(coleccion))
print(coleccion)
colec=list(cliente_1.keys())
print(type(colec))
print(colec)

Resultado:

<class 'dict_keys'>
dict_keys(['id_Cliente', 'nombre', 'Apelllidos', 'edad', 'dirección', 'tfno'])
<class 'list'>
['id_Cliente', 'nombre', 'Apelllidos', 'edad', 'dirección', 'tfno']

NOTA:

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

Tuplas y Conjuntos

Variables de tipo Tupla

Las variables de tipo tupla son una colección de valores que se pueden repetir, pero que no pueden modificarse, son inmutables. Se representan con paréntesis ( ) y no se pueden modificar, son inmutables. Se crean empleando paréntesis, en lugar de corchetes como hacíamos con las listas.

tupla=("Cadiz",2,True,"Cadiz",[34,44])
print(type(tupla))
print(tupla)

Si ejecutamos el código anterior obtenemos:

<class 'tuple'>
('Cadiz', 2, True, 'Cadiz', [34, 44])

Accediendo a los elementos de una tupla

Accedemos a los elementos de una tupla igual que accedíamos a los de una lista, a través del índice que indica la posición. El índice se indica entre corchetes rectos, igual que con las listas

dias_semana=("Lunes","Martés","Miércoles","Jueves","Viernes",
             "Sábado","Domingo")
primer_dia=dias_semana[0]
ultimo_dia=dias_semana[-1]
print(f"El primer día de la semana es {primer_dia}")
print(f"El último día de la semana es {ultimo_dia}")

Y el resultado:

El primer día de la semana es Lunes
El último día de la semana es Domingo

Al ser inmutables no se puede modificar el valor de un elemento determinado:

dias_semana=("Lunes","Martés","Miércoles","Jueves","Viernes",
             "Sábado","Domingo")
dias_semana[0]="Monday"

El código anterior arroja el error:

TypeError: 'tuple' object does not support item assignment

Las tuplas tienen métodos similares a las listas, pero no aplicarían los métodos en los que se modifican valores, ya que son inmutables.

dias_semana=("Lunes","Martés","Miércoles","Jueves","Viernes",
             "Sábado","Domingo")
num_elementos=len(dias_semana)
print(f"Numero de elementos: {num_elementos}")
indice=dias_semana.index("Jueves")
print(f"Indice: {indice}")
cuenta=dias_semana.count("Jueves")
print(f"cuenta: {cuenta}")

Resultado

Numero de elementos: 7
Indice: 3
cuenta: 1

Variables de tipo Conjunto

Las variables de tipo conjunto son una colección de valores únicos mutables. Es decir, los valores no se pueden repetir, pero si se pueden cambiar, podemos añadir y eliminar elementos del conjunto.

Para crear un conjunto, encerramos los elementos entre corchetes llave. El tipo devuelto, el tipo conjunto, es set

conjunto={3,5,"Hola"}
print(type(conjunto))

Resultado:

<class 'set'>

Operaciones con conjuntos

Este tipo de colecciones disponen de una serie de operadores propios para manejarlos

  • El operador unión (“|”): conjunto_1 | conjunto_2. Devuelve un nuevo conjunto que tienen todos los elementos de los conjuntos operandos, pero sin elementos repetidos.
conjunto_1={1,2,3,4,5}
conjunto_2={3,4,5,6,7}
union=conjunto_1|conjunto_2
print(union)

Resultado:

{1, 2, 3, 4, 5, 6, 7}

El operador intersección (“&”): conjunto_1 & conjunto_2. Devuelve un nuevo conjunto con los elementos comunes a ambos conjuntos operandos.

conjunto_1={1,2,3,4,5}
conjunto_2={3,4,5,6,7}
interseccion=conjunto_1&conjunto_2
print(interseccion)

Resultado:

{3, 4, 5}

El operador diferencia (“-“): conjunto_1 – conjunto_2. Devuelve los elementos del primer conjunto operando que no están en el segundo.

conjunto_1={1,2,3,4,5}
conjunto_2={3,4,5,6,7}
dif1=conjunto_1-conjunto_2
dif2=conjunto_2-conjunto_1
print(f"elementos del conjunto 1 que no están en el 2: {dif1}")
print(f"elementos del conjunto 2 que no están en el 1: {dif2}")

Resultado:

elementos del conjunto 1 que no están en el 2: {1, 2}
elementos del conjunto 2 que no están en el 1: {6, 7}

Accediendo a los elementos de un conjunto

Los conjuntos no disponen de índices, por lo que no podremos emplearlos para acceder a sus elementos. Para recuperar los distintos elementos de un conjunto lo recorremos con un bucle

conjunto={3,5,"Hola"}
for elemento in conjunto:
    print(elemento)

Resultado:

3
5
Hola

Conocer si un elemento pertenece a un conjunto

Empleando el operador in, podemos saber si un elemento pertenece a un conjunto

conjunto={"Ana","Pepe","Rosa","Guillermo","Juan"}
persona="Rosa"
if persona in conjunto:
    print(f"{persona} está en el grupo")

Resultado:

Rosa está en el grupo

Eliminar duplicados de una lista: casting a Set

Una manera rápida de eliminar duplicados de una lista es convertirla en un tipo conjunto, para ello haríamos casting de la lista a set

lista=["cepillo","pasta de dientes","desodorante",
       "colonia","tijeras","cepillo","desodorante"]
conjunto=set(lista)
print("LISTA:")
print(lista)
print("CONJUNTO:")
print(conjunto)

Resultado:

LISTA:
['cepillo', 'pasta de dientes', 'desodorante', 'colonia', 'tijeras', 'cepillo', 'desodorante']
CONJUNTO
{'cepillo', 'colonia', 'tijeras', 'pasta de dientes', 'desodorante'}

Métodos asociados a los conjuntos

Las variables de tipo conjunto tienen una serie de métodos asociados:

  • add (<elemento>): Añade al conjunto el elemento indicado.
conjunto={"Ana","Pepe","Guillermo"}
persona="Lourdes"
conjunto.add(persona)
print(conjunto)

Resultado:

{'Guillermo', 'Lourdes', 'Pepe', 'Ana'}
  • clear( ): Elimina todos los elementos del conjunto
conjunto={"Ana","Pepe","Guillermo"}
conjunto.clear()
print(conjunto)

Resultado:

set()
  • copy( ): genera una copia del conjunto.
conjunto_1={"Ana","Pepe","Guillermo","Lourdes"}
conjunto_2=conjunto_1.copy()
conjunto_1.clear()
print(f"conjunto 1: {conjunto_1}")
print(f"conjunto 2: {conjunto_2}")

Resultado:

conjunto 1: set()
conjunto 2: {'Guillermo', 'Lourdes', 'Pepe', 'Ana'}
  • discard(<elemento>): elimina del conjunto el elemento indicado
conjunto={"Ana","Pepe","Guillermo","Lourdes"}
conjunto.discard("Guillermo")
print(f"conjunto: {conjunto}")

Resultado:

conjunto: {'Lourdes', 'Pepe', 'Ana'}
  • issubset(<conjunto_2>): comprueba si el conjunto pasado como parámetro está incluido en el conjunto al que se le aplica el método. Devuelve verdadero o falso.
conjunto_1={"Ana","Jesús"}
conjunto_2={"Ana","Lourdes","Jesús"}
if conjunto_1.issubset(conjunto_2):
    print("conjunto 2 está incluido en conjunto 1")

Resultado:

conjunto 2 está incluido en conjunto 1

NOTA:

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

Ejercicios con Listas en Python

En este post propongo algunos ejercicios básicos con listas en Python para practicar lo aprendido en el artículo de Listas.

El código de los programas viene con varios comentarios que pretenden hacer lo más comprensible posible la solución que se plantea.

Ejercicio 1: Contar vocales de una frase

Realiza un programa que solicite al usuario que introduzca una frase y cuente cuántas vocales hay en ella. El programa debe contar tanto las vocales minúsculas como las mayúsculas.

Por ejemplo:

  • Frase introducida: “Ocho elefantes comen trigo en un trigal”
  • Resultado: 14 vocales

Solución propuesta:

# Solicitar al usuario que introduzca una frase
frase = input("Introduce una frase: ")

# Inicializar el contador de vocales
contador_vocales = 0

# Definir una lista de vocales tanto en minúsculas como mayúsculas
vocales = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']

# Contar el número de vocales en la frase
for caracter in frase:
    if caracter in vocales:
        contador_vocales += 1

# Imprimir el resultado
print("Resultado:", contador_vocales, "vocales")

Ejercicio 2: Lista de listas

Crear la siguiente lista de dos dimensiones: lis1 = [[4,3,5],[3,5,8],[4,5,6]]. Con esta lista realizamos las siguientes operaciones:

  1. Crear una función llamada obt_valor_medio que calcule usando iteraciones el valor medio de todos elementos de la lista anterior (resultado: 4,78).
  2. Crear una función que realice un cálculo sobre los elementos de la lista anterior. El alumno puede elegir el cálculo a realizar. La función recibe como entrada la lista y da un valor de retorno.

Solución propuesta:

# Lista inicial
lis1 = [[4, 3, 5], [3, 5, 8], [4, 5, 6]]

# Función para obtener el valor medio
def obt_valor_medio(lista):
    suma_elementos = 0
    num_elementos = 0
    for sublista in lista:
        for elemento in sublista:
            suma_elementos += elemento
            num_elementos += 1
    return suma_elementos/num_elementos

# Función que devuelve el valor máximo
def obt_valor_maximo(lista):
    maximo = lista[0][0]  # Inicializar el máximo con el primer elemento de la lista
    for sublista in lista:
        for elemento in sublista:
            if elemento > maximo:
                maximo = elemento
    return maximo

# Llamadas a las funciones
valor_medio = obt_valor_medio(lis1)
valor_maximo = obt_valor_maximo(lis1)

# Mostrar los resultados
print(f"Valor medio de los elementos de la lista: {valor_medio}")
print(f"Valor máximo de los elementos de la lista: {valor_maximo}")

Ejercicio 3: Invertir cadena de caracteres

Escribe un programa en Python que solicite al usuario ingresar una cadena de caracteres y luego imprima la misma cadena, pero con los caracteres en orden inverso. Por ejemplo, si el usuario ingresa «Hola mundo», el programa deberá imprimir «odnum aloH”.

Solución propuesta:

cadena = input("Ingrese una cadena de caracteres: ")
# Invierte la cadena usando el operador de slicing [::-1]
cadena_invertida = cadena[::-1]
print("La cadena invertida es:", cadena_invertida)

Ejercicio 4: Mediana de una lista

Escribe un programa que obtenga la mediana de una lista de enteros. La lista es inicializada en el código, no hay que pedir al usuario que introduzca ningún dato. Y el programa tiene que funcionar para cualquier lista, con independencia de la longitud de esta.

No sé puede utilizar la función median de la librería statistics que devuelve la mediana directamente, se trata de programar esa función.

Nota: Recordad que la mediana es el valor que ocupa el lugar central de un conjunto de datos ordenados. Por tanto, si un conjunto de datos tiene un número de elementos impar, la mediana es el valor que ocupa la posición central, teniendo el mismo número de elementos mayores que elementos menores. Si el conjunto de datos tiene un número par de elementos, entonces la mediana es la media de los dos valores centrales.

lista = [1,21,7,5,3,11,10]
# Ordenamos la lista en orden ascendente 
lista_ordenada = sorted(lista)
n = len(lista_ordenada)
# Calculamos la posición del elemento central
mitad=int(n/2)
# Verificamos si la longitud de la lista es par o impar
if n % 2 == 0: # Si es par, la mediana es el promedio de los dos elementos centrales
    mediana = (lista_ordenada[mitad-1] + lista_ordenada[mitad]) / 2
else:  # Si es impar, la mediana es el elemento central
    mediana = lista_ordenada[mitad]

print("La mediana de la lista es:", mediana)

Ejercicio 5: Detectando anagramas

Escribe un programa en Python que solicite al usuario ingresar una cadena de caracteres y luego determine si esa cadena es un anagrama de otra cadena ingresada posteriormente. Dos cadenas son anagramas si tienen las mismas letras, pero en distinto orden. Por ejemplo, «roma» y «amor» son anagramas.

# Solicitamos al usuario que ingrese la primera cadena
cadena1 = input("Ingrese la primera cadena: ")

# Solicitamos al usuario que ingrese la segunda cadena
cadena2 = input("Ingrese la segunda cadena: ")

# Convertimos ambas cadenas a minúsculas para compararlas de manera case insensitive
cadena1 = cadena1.lower()
cadena2 = cadena2.lower()

# Ordenamos ambas cadenas y comparamos si son iguales
if sorted(cadena1) == sorted(cadena2):
    print("Las cadenas son anagramas")
else:
    print("Las cadenas no son anagramas")

NOTA:

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

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:

&lt;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í.