Lista, tuplas, diccionarios

Programación - Ingeniería en Geología

Profesor: Santiago Quiñones

Docente Investigador

Departamento de Ingeniería Civil

Contenidos

Colecciones de datos

Colecciones de datos

Las colecciones de datos en Python permiten almacenar y manipular múltiples valores de manera eficiente. Las principales estructuras de colección en Python son:

Ejemplo motivador

# ❌ Sin estructuras de datos organizadas
muestra1_id = "M001"
muestra1_tipo = "granito"
muestra1_cuarzo = 35.2
muestra1_profundidad = 15.5

muestra2_id = "M002"
muestra2_tipo = "basalto"
muestra2_cuarzo = 8.1
muestra2_profundidad = 22.0

# ... ¡Imagina 100 muestras así!

# ✅ Con estructuras organizadas
muestras = {
    "M001": {"tipo": "granito", "cuarzo": 35.2, "profundidad": 15.5},
    "M002": {"tipo": "basalto", "cuarzo": 8.1, "profundidad": 22.0}
}

Listas

Tipos de datos en Python

  • float - números reales
  • int - números enteros
  • str - cadenas, texto
  • bool - True, False

Cada variable representa un solo valor

altura = 1.73 
alto = True

Problema

  • Ciencia de datos: muchos puntos de datos
  • Altura de una familia entera
altura1 = 1.73 
altura2 = 1.68
altura3 = 1.71
altura4 = 1.89

Listas en Python

Las listas son estructuras de datos que pueden contener múltiples valores en un orden específico. Son mutables, lo que significa que sus elementos pueden modificarse después de su creación.

Creación de listas

valores = [10, 20, 30, 40]

Sintaxis

Listas Python

  • [a, b, c]
[1.73, 1.68, 1.71, 1.89]
[1.73, 1.68, 1.71, 1.89]
familia = [1.73, 1.68, 1.71, 1.89]
print(familia)
[1.73, 1.68, 1.71, 1.89]
  • nombra una colección de valores
  • contiene cualquier tipo de datos

Listas en Python

Acceder a los elementos de una lista

print(valores[0]) # Accede al primer elemento
print(valores[2]) # Accede al tercer elemento
print(valores[3]) # Accede al último elemento

# Salida
10
30
40

Subconjuntos en listas

familia = ["hermano", 1.73, "hermana", 1.68, "papa", 1.71, "mama", 1.89]
print(familia)
["hermano", 1.73, "hermana", 1.68, "papa", 1.71, "mama", 1.89]
familia[3]
1.68

Listas en Python

Acceder a elementos con índices negativos

print(valores[-1]) # Accede al último elemento
print(valores[-2]) # Accede al penúltimo elemento


# Salida
40
30

-1

-2

-3

-4

Subconjuntos en listas

["hermano", 1.73, "hermana", 1.68, "papa", 1.71, "mama", 1.89]
familia[4]
'papa'
familia[-1]
1.89
familia[7]
1.89

Listas en Python

Acceder a un rango de elementos

# Elementos desde la posición 1 hasta 2 (sin incluir 3)
print(valores[1:3]) 

Se puede seleccionar un subconjunto de elementos de una lista usando rebanado (slicing).

nombre_lista [   inicio   :   final   ]

                             inclusivo      exclusivo

Rebanando listas

["hermano", 1.73, "hermana", 1.68, "papa", 1.71, "mama" 1.89]
familia
[1.68, "papa"]
familia[3:5]

[   inicio   :   final   ]

    inclusivo      exclusivo

[1.73, "hermana", 1.68]
familia[1:4]

Rebanando listas

["hermano", 1.73, "hermana", 1.68, "papa", 1.71, "mama", 1.89]
familia
["hermano", 1.73, "hermana", 1.68
familia[:4]
[1.71, "mama" 1.89]
familia[5:]

Listas en Python

Modificar elementos en una lista

valores[2] = 35 # Modifica el tercer elemento

índice del elemento a modificar

nuevo valor

Modificación de datos

# Mediciones de dureza de minerales (escala Mohs)
durezas = [6.5, 7.2, 5.8, 8.1, 6.9]

# Agregar nuevas mediciones
durezas.append(7.8)                    # Al final
durezas.insert(2, 6.3)                 # En posición específica
durezas.extend([8.5, 5.9])             # Múltiples valores

# Eliminar datos erróneos
durezas.remove(5.8)                    # Por valor
ultimo = durezas.pop()                 # Elimina y retorna último
del durezas[1]                         # Por índice

Búsqueda y análisis

# Mediciones de pH en muestras de suelo
ph_suelos = [6.8, 7.2, 5.9, 7.0, 7.1, 6.5]

print(7.0 in ph_suelos)  # verifica si el valor exacto 7.0 está presente en la lista

# Análisis de acidez
if 7.0 in ph_suelos:
    print("Hay muestra con pH neutro")

posicion = ph_suelos.index(7.1)        # Encontrar posición
cantidad_neutras = ph_suelos.count(7.2) # Contar apariciones

# Estadísticas básicas
total_muestras = len(ph_suelos)
ph_max = max(ph_suelos)
ph_min = min(ph_suelos)
promedio = sum(ph_suelos) / len(ph_suelos)

Estructuras repetitivas

Implementación en Python - Estructura for

for variable in iterable:
    # Código a ejecutar en cada iteración
    

Sintaxis

Nombre que se da al elemento actual en cada iteración

cualquier objeto iterable (lista, tupla, diccionario, cadena)

El for es otro bloque de código, se debe agregar los dos puntos y utilizar identaciones para las acciones.  

Bucles con listas

minerales = ["Cuarzo", "Feldespato", "Calcita"]
durezas = [7, 6, 3]

# Bucle simple
for mineral in minerales:
    print(mineral)

# Bucle con índice
for i, mineral in enumerate(minerales):
    print(f"{i}: {mineral}")

# Bucle con dos listas
for mineral, dureza in zip(minerales, durezas):
    print(f"{mineral}: {dureza} en escala Mohs")

# Bucle con rango
for i in range(len(minerales)):
    print(f"Mineral {i+1}: {minerales[i]}")

Tuplas

Tuplas en Python

Las tuplas son similares a las listas, pero su principal diferencia es que son inmutables, lo que significa que no pueden modificarse después de su creación.

Creación de una tupla

coordenadas = (3.5, 5.7)

Sintaxis

Tuplas en Python

Acceder a elementos en una tupla

# Coordenadas de una estación geológica (latitud, longitud)
estacion_A = (-0.2201, -78.5125)  # grados decimales

# Propiedades del granito
granito = ("Granito", 7.5, 2.65)  # tipo, dureza Mohs, densidad g/cm³

# Acceso igual que listas
latitud = estacion_A[0]          # -0.2201
tipo_roca = granito[0]           # "Granito"

Desempaquetado 

# Coordenadas de una estación geológica (latitud, longitud)
estacion_A = (-0.2201, -78.5125)  # grados decimales

# Propiedades del granito
granito = ("Granito", 7.5, 2.65)  # tipo, dureza Mohs, densidad g/cm³

# Muy útil para trabajar con coordenadas
latitud, longitud = estacion_A
print(f"Estación en Lat: {latitud}, Lon: {longitud}")

# Para propiedades de rocas
tipo, dureza, densidad = granito
print(f"Roca: {tipo}, Dureza: {dureza} Mohs")

Ejemplo práctico: distancia entre 2 puntos

import math

def distancia_entre_puntos(punto1, punto2):
    """Calcula distancia entre dos puntos"""
    
    # extraer los datos de los dos puntos
    # complete su código aquí
    
    distancia = math.sqrt((x2-x1)**2 + (y2-y1)**2)
    return distancia

# Uso
inicio = (0, 0)
final = (30, 40)
dist = distancia_entre_puntos(inicio, final)
print(f"Distancia: {dist} m")  # Resultado: 50.0 m

Diccionarios

Diccionarios en Python

Los diccionarios almacenan datos en pares clave-valor y permiten un acceso rápido a la información.

Creación de un diccionario

estudiante = {"nombre": "Carlos", "edad": 22, "curso": "Python"}

Sintaxis

Diccionarios en Python

Creación y acceso

# Propiedades de una muestra geológica
muestra = {
    "id": "M001",
    "tipo": "granito",
    "profundidad": 15.5,    # metros
    "cuarzo": 35.2,         # porcentaje
    "ph": 6.8               # acidez
}

# Acceso a propiedades
profundidad = muestra["profundidad"]        # 15.5
ph = muestra.get("ph", 7.0)                 # 6.8 (seguro), devuelve 7.0 en caso de no encontrar

Iteración

# Propiedades de una muestra geológica
muestra = {
    "id": "M001",
    "tipo": "granito",
    "profundidad": 15.5,    # metros
    "cuarzo": 35.2,         # porcentaje
    "ph": 6.8               # acidez
}

# Recorrer todas las propiedades
for propiedad, valor in muestra.items():
    print(f"{propiedad}: {valor}")
    
# Solo las claves
propiedades = list(muestra.keys())
# Solo los valores
valores = list(muestra.values())

# Verificaciones
if "cuarzo" in muestra:
    print(f"Contenido de cuarzo: {muestra['cuarzo']}%")

# Acceso a propiedades
profundidad = muestra["profundidad"]        # 15.5
ph = muestra.get("ph", 7.0)                 # 6.8 (seguro), devuelve 7.0 en caso de no encontrar

Ejemplo práctico: calculadora de volumen de muestra

def calcular_volumen_muestra(muestra):
    """Calcula el volumen de una muestra cilíndrica"""
    import math
    
    # extraer la información de diametro y altura
    # complete el código aquí
    
    radio = diametro / 2
    volumen = math.pi * radio**2 * altura
    
    return volumen

# Uso
mi_muestra = {
    "id": "M001",
    "diametro": 0.08,  # metros (8 cm)
    "altura": 0.15,    # metros (15 cm)
    "tipo": "granito"
}

volumen = calcular_volumen_muestra(mi_muestra)
print(f"Volumen de la muestra: {volumen:.6f} m³")

Ejemplo práctico: análisis de dureza de minerales

def analizar_dureza_minerales(durezas):
    """Analiza la dureza de minerales y clasifica por resistencia"""
    duros = []
    blandos = []
    
    for dureza in durezas:
        if dureza > 6:  # escala Mohs
            duros.append(dureza)
        else:
            blandos.append(dureza)
    
    return {
        "total_minerales": len(durezas),
        "minerales_duros": duros,
        "minerales_blandos": blandos,
        "dureza_maxima": max(durezas),
        "dureza_promedio": sum(durezas) / len(durezas)
    }

# Uso
durezas_minerales = [3.5, 7.2, 5.8, 8.1, 4.5, 9.0, 6.2]
resultado = analizar_dureza_minerales(durezas_minerales)
print(f"Minerales duros: {len(resultado['minerales_duros'])}")

Retos

Reto 1: Suma de elementos

 

Generar una función devuelva la suma de un arreglo bidimensional; mismo que se lo recibe como parámetro.

 

El arreglo para probar la solución es:

informacion = [[1, 2, 3], [10, 20, 30], [100, 200, 300]]

 

La función debe se invocada desde la función principal; además el método debe recibir como parámetro un arreglo bidimensional.

Reto 2: Promedio

Dado un arreglo; por ejemplo:

 

informacion = [1, 2, 3, 10, 20, 30, 100, 200, 300]

 

Generar las función que devuelva la media aritmética del arreglo; recibe como parámetro un arreglo de tipo entero

 

muestras_geologicas = {
    "Muestra M001": {
        "tipo_roca": "Granito",
        "profundidad": 15.5,  # en metros
        "textura": "faneritica",
        "composicion": {
            "cuarzo": 35.2,      # porcentaje
            "feldespato": 42.1,  # porcentaje
            "mica": 22.7         # porcentaje
        },
        "dureza": 7.5,  # escala Mohs
        "ubicacion": "Cordillera Oriental"
    },
    "Muestra M002": {
        "tipo_roca": "Basalto",
        "profundidad": 8.2,   # en metros
        "textura": "afanitica",
        "composicion": {
            "plagioclasa": 58.4,  # porcentaje
            "piroxeno": 31.6,     # porcentaje
            "olivino": 10.0       # porcentaje
        },
        "dureza": 6.0,  # escala Mohs
        "ubicacion": "Valle Interandino"
    }
}

Reto 3: Extracción de datos

Tema URL
Espacios de nombres, módulos https://j2logo.com/python/tutorial/espacios-de-nombres-modulos-y-paquetes/
Parámetros posicionales y parámetros con nombre en una función https://j2logo.com/tipo-parametros-funcion-python/
Variables locales y globales https://snakify.org/es/lessons/functions/
Funciones y parámetros https://j2logo.com/python/tutorial/funciones-en-python/#function-params
Importing Your Own Python Modules Properly https://www.youtube.com/watch?v=GxCXiSkm6no&ab_channel=NeuralNine

Referencias