Python para Ciencias de la Tierra

Capítulo 2: Conceptos Básicos de Programación en Python (Pt. 3)

Damian
10 min readMay 11, 2023

--

Índice del curso
<<
Capítulo 2: Conceptos Básicos de Programación (Pt. 2)

2.2 Estructuras Básicas de Datos (cont.)

Diccionarios

Hasta ahora hemos visto tres estructuras que son colecciones de datos ordenados, lo que permite manipularlos con índices. Sin embargo hay algunas estructuras no ordenadas, es decir que sus elementos no tienen un índice numérico asociado. Una de estas estructuras es el diccionario.

Los diccionarios son estructuras no ordenadas, ya que no cuentan con un índice entero que dé orden a sus elementos. En cambio tienen sus ‘índices’ equivalentes llamados clave, o key, en inglés. La clave puede ser un número o una cadena, y es irrepetible. A cada clave le corresponde un valor, o value. Esto forma un par de elementos clave-valor o key-value.

Como su nombre lo indica, pueden entenderse justamente como diccionarios, donde hay una serie de palabras (las claves) irrepetibles, y cada una tiene un significado (los valores). Los símbolos de agrupación que los distingue son las llaves {}. A continuación se muestran las formas más comunes de declarar diccionarios vacíos o con elementos :

#Declaración de diccionarios vacíos
dict_v1 = {}
dict_v2 = dict()

#Declaración de diccionarios con elementos
dict_1 = {'Clave1':'Valor1', 'Clave2':2, 3: 'Valor3'}
dict_2 = dict(Clave1 = 'Valor1', Clave2 = 2, Clave3 = 'Valor3')

print(dict_v1, dict_1, dict_2)

>>{} {‘Clave1’: ‘Valor1’, ‘Clave2’: 2, 3: ‘Valor3’} {‘clave1’: ‘Valor1’, ‘Clave2’: 2, ‘Tres’: ‘Valor3’}

Observa que utilizando la función dict no es necesario utilizar las comillas para indicar que la clave es una cadena. Sin embargo, esta forma no admite tener números como claves, como se aprecia en dict_1, donde el entero 3 es una clave. Las parejas clave-valor pueden estar separadas por dos puntos o un sigo igual según la forma de declararlo. Una coma separa a las parejas entre sí.

Para acceder a los datos se deben conocer las claves para escribirlas dentro de corchetes como si de índices se tratara. Los valores no se deben escribir en los corchetes.

print(dict_1['Clave1'], dict_1[3], dict_2['Clave1'])

>>Valor1 Valor3 Valor1

Una propiedad interesante de los diccionarios es que no importa qué tan grande sea, siempre le tomará el mismo tiempo acceder a un valor en específico.

Otra forma de acceder a un valor es con el método get(), el cual también permite agregar un mensaje en caso de que la clave no exista en el diccionario. Su sintaxis es diccionario.get(clave, mensaje_de_no_haber_clave).

print(dict_1.get('Clave2'))

>> 2

Para agregar un nuevo elemento basta con especificar la nueva pareja de la siguiente forma:

dict_1['Clave4'] = 'Valor4'

De la misma forma se puede editar un valor:

dict_1['Clave1'] = 1
print(dict_1)

>> {‘Clave1’: 1, ‘Clave2’: 2, 3: ‘Valor3’, ‘Clave4’: ‘Valor4’}

Para borrar un elemento de nuevo podemos utilizar el operador del, el cual también puede utilizarse para borrar todo el diccionario.

del dict_1[3]
print(dict_1)

>> {‘Clave1’: 1, ‘Clave2’: 2, ‘Clave4’: ‘Valor4’}

El operador in es válido pero sólo con las claves de los diccionarios. Y la función len() obtiene el número de parejas clave-valor.

El método clear() borra todos los elementos, claves y valores, de un diccionario.

dict_1.clear()
print(dict_1)

>> {}

El método pop() extrae y elimina la pareja clave-valor especificada

dict_2.pop('Clave1')

>> ‘Valor1’

El método items() muestra las parejas que contiene el diccionario.

print(dict_2.items())

>> dict_items([(‘Clave2’, 2), (‘Tres’, ‘Valor3’)])

El método keys() muestra las claves del diccionario.

print(dict_2.keys())

>> dict_keys([‘Clave2’, ‘Tres’])

De forma análoga, el método values() muestra los valores.

print(dict_2.values())

>> dict_values([2, ‘Valor3’])

Ejemplo 2.1 - Organización de datos de las provincias petroleras de México para su consulta.
Contexto:
México cuenta con 23 sistemas petroleros identificados, de los cuales 12 se consideran Provincias Petroleras (SENER, 2020) ya que son sistemas petroleros activos, en exploración o producción. Cada una de ellas puede caracterizarse por el hidrocarburo que más produce, en caso de hacerlo; la época a la que pertenece la roca generadora y el tipo de trampa que contiene a la roca almacén. La siguiente tabla resume esta información sobre las 12 provincias.

Tabla 2.4. Algunas características de las provincias petroleras mexicanas (SENER, 2020)

Se desea organizar esta tabla en una estructura de datos, tal que podamos acceder a la información de toda una provincia con una única consulta.

Desarrollo: El diccionario es la estructura que nos permite cubrir los requisitos. Las listas y las tuplas, aunque admiten listas dentro de ellas, necesitaríamos asociar un índice a cada una, cosa que es posible, pero agrega una columna innecesaria.

¿Qué columna debe ser la que se convierta en las claves del diccionario? Como las claves deben ser irrepetibles, la columna que cumple con ese requisito es Provincia Petrolera. El valor para cada clave será la serie de elementos restantes de cada fila. Se pueden agregar como una lista, pensando que más adelante haya que sumar más columnas (Ejercicio 2.12). Si fuera una tabla definitiva, lo recomendable sería utilizar una tupla para cada renglón.

Como se nos dieron los datos, se nos imposibilita introducirlos de otra forma que no sea a mano (así es). Es una tarea sencilla, pero tardada y fastidiosa, y es casi seguro que a la cuarta o quinta provincia capturada nos equivoquemos al transcribir. Por eso mejor organicemos las listas aparte. Cada lista se llamará como la provincia que caracteriza, procurando abreviar el nombre sin perder el sentido del mismo.

sabinas = ['Gas seco', 'Jurásico Superior', 'Estructurales laramídicas']

burgos = ['Gas no asociado', 'Jurásico Superior',
'Anticlinales tipo roll-over']

tampico_misantla = ['Aceite', 'Jurásico Inferior-Medio',
'Estructurales y estratigráficas']

tampico_misantla = ['Aceite', 'Jurásico Inferior-Medio',
'Estructurales y estratigráficas']

veracruz = ['Gas y aceite', 'Jurásico Superior',
'Anticlinales con fallas inversas']

sureste = ['Aceite', 'Jurásico Superior', 'Estructurales y combinadas']

golfo_mx = ['Aceite y gas', 'Jurásico Superior', 'Estructurales y combinadas']

yucatan = ['Aceite', 'Cretácico Inferior-Medio',
'Estructurales y estratigráficas']

cp_chiapas = ['Aceite y condensados', 'Jurásico Superior', 'Estructurales']

cp_sierra_madre = ['Sin Registro', 'Jurásico Superior',
'Estructural laramídica']

chihuahua = ['Sin Registro', 'Jurásico Superior', 'Estructurales']

golfo_california = ['Gas seco', 'Mioceno', 'Combinadas']

vizcaino_purisima_iray = ['Sin Registro', 'Paleoceno',
'Estratigráficas y combinadas']

Ya tenemos las listas con los nombres de las provincias. Ahora podemos definir el diccionario donde cada una de ellas será el valor asociado a las claves.

provincias_petroleras = {'Sabinas-Burgos-Picachos':sabinas, 'Burgos':burgos, 
'Tampico-Misantla':tampico_misantla, 'Veracruz':veracruz,
'Cuencas de Sureste':sureste, 'Golfo de México Profundo':golfo_mx,
'Plataforma de Yucatán':yucatan, 'Cinturón Plegado de Chiapas':cp_chiapas,
'Cinturón Plegado de la Sierra Madre Oriental':cp_sierra_madre,
'Chihuahua':chihuahua, 'Golfo de California':golfo_california,
'Vizcaino-La Purísima-Iray':vizcaino_purisima_iray}

Hemos terminado de capturar los datos. Observa que se cuida tener parejas clave-valor completas en cada renglón, para que sea más fácil leer el diccionario. Si imprimes el diccionario (no es necesario usar print), obtienes este resultado:

Figura 2.16 Muestra del diccionario de las provincias petroleras mexicanas

Y las consultas se pueden hacer escribiendo el nombre de la provincia de la que se quiere conocer la información.

provincias_petroleras['Burgos']

>>[‘Gas no asociado’, ‘Jurásico Superior’, ‘Anticlinales tipo roll-over’]

Fin del ejemplo 2.1

Un pequeño anuncio: Puedes descargar el código hecho en cada una de las sesiones y los ejercicios resueltos, así como apoyarme a hacer más contenido como éste, suscribiéndote a mi patreon: https://www.patreon.com/ciencias_tierra.

Conjuntos

Los conjuntos son estructuras que como las listas y tuplas tienen una única serie de elementos, pero como los diccionarios, no tienen un orden. Sólo admiten elementos irrepetibles. Sus elementos son inmutables y pueden ser cualquier tipo de dato excepto otras estructuras de datos como listas y tuplas. Es más rápido acceder a sus elementos que a los de las listas.

Para declarar un conjunto vacío se usa la función set(). Para definir un conjunto con elementos, puede hacerse como se muestra en las siguientes líneas.

s1 = set([1, 2, 3, 4, 5])
s2 = set((2, 4, 5, 6, 8))
s3 = {3, 6, 9, 12, 15}
print(s1, s2, s3)

>> {1, 2, 3, 4, 5} {2, 4, 5, 6, 8} {3, 6, 9, 12, 15}

Y en caso de agregar valores repetidos en la definición del conjunto:

s4 = {1,1,1,2,2,3,4,5,5,5,6}
print(s4)

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

En automático elimina los elementos que se repiten.

Las funciones usadas en las listas, len(), sum(), max() y min(); y los métodos pop() y remove() tienen la misma utilidad en los conjuntos. La función sorted() también ordena al conjunto, pero lo convierte en una lista.

Una de las principales utilidades de los conjuntos es que, como su nombre lo indica, pueden tratarse matemáticamente como tales. Por ello existen los métodos union(), intersection(), difference(), issubset(), isdisjoint(), entre otros. La unión y la intersección también pueden realizarse con los operadores | y & respectivamente.

s1 | s3

>> {1, 2, 3, 4, 5, 6, 9, 12, 15}

s1 & s2

>> {2, 4, 5}

Los métodos add() y discard() permiten agregar y eliminar un elemento respectivamente.

Por último, existen los conjuntos estáticos, los cuales son conjuntos pero inmutables. No se les puede añadir ni eliminar un sólo elemento. La forma de declararlos es:

fs = frozenset([1, 2, 3, 4, 8, 9, 10])
print(fs)

>> frozenset({1, 2, 3, 4, 8, 9, 10})

A manera de resumen, se muestra la tabla 4.5 con varias de las características de las estructuras vistas hasta ahora, y sus operaciones.

Tabla 4.5 Resumen de las operaciones de las estructuras de datos más utilizados en Python.

Conversión de tipos de datos

Desde la segunda sesión hemos visto las características que tienen los tipos de dato y las estructuras de datos más utilizados en python. Pero hay ocasiones en que necesitamos cambiar de un tipo de dato a otro, y por ello debemos saber cómo hacerlo de forma rápida. Ahora veremos cómo se pueden intercambiar entre sí.

Función int(): Convierte a valor entero un valor flotante o una cadena que sólo tenga un número, sin espacios, letras ni cualquier otro símbolo no numérico. Trunca la parte decimal del flotante.

print('Flotante a entero:', int(4.56),'Cadena a entero:', int('42'))

>> Flotante a entero: 4 Cadena a entero: 42

Función float(): Convierte un valor entero o una cadena que sólo tenga al número decimal a convertir.

print('Entero a flotante:', float(17),'Cadena a flotante:', float('4.23'))

>> Entero a flotante: 17.0 Cadena a flotante: 4.23

Función complex(): Convierte enteros, flotantes y cadenas en complejos.

print('Entero a complejo:', complex(11),'Flotante a complejo:', complex(4.8), 
'Cadenas a complejos:', complex('3'), complex('2-3j'))

>> Entero a complejo: (11+0j) Flotante a complejo: (4.8+0j) Cadenas a
>> complejos: (3+0j) (2–3j)

Función str(): Convierte cualquier valor numérico en cadena.

print('Entero a cadena:', str(11),'Flotante a cadena:', str(4.8), 
'Complejo a cadena:', str(2-3j))

>> Entero a cadena: 11 Flotante a cadena: 4.8 Complejo a cadena: (2–3j)

También puede convertir una lista en cadena, pero no como lo podrías desear. Inténtalo.

Una función extra, la cual propiamente no convierte un dato a otro, pero sí codifica es la función chr(): Convierte un número entero en su símbolo correspondiente como si el entero suera código ASCII.

print(chr(83), chr(92), chr(255))

>> S \  ÿ

Las estructuras de datos también pueden intercambiarse entre sí.

Función list(): Convierte en listas a las tuplas, los conjuntos, a las claves de un diccionario, así como a sus valores.

print(list((1,2,3,4)))

>> [1, 2, 3, 4]

print(list({1,2,2,3,4,5,5}))

>> [1, 2, 3, 4, 5]

dicc = {'k1':1, 'k2':2, 'k3':3, 'k4':4}
keys = dicc.keys()
print(list(keys))

>> [‘k1’, ‘k2’, ‘k3’, ‘k4’]

values = dicc.values()
print(list(values))

>> [1, 2, 3, 4]

Si pretendes transformar un diccionario en lista, sin especificar si son claves o valores, sólo se convierte en lista las claves.

Función tuple(): Convierte en tuplas a las listas, los conjuntos, a las claves y a los valores de los diccionarios.

Función set(): Convierte en conjuntos a las listas, las tuplas, a las claves y a los valores de los diccionarios.

Función dict(): Convierte en diccionario a las listas y a las tuplas, donde cada uno de sus elementos debe ser una lista o tupla que contenga la pareja clave-valor. Ejemplo:

print(dict([('uno',1),('dos',2),('tres',3)]))

>> {‘uno’: 1, ‘dos’: 2, ‘tres’: 3}

Las tuplas internas tienen como primer elemento a la clave, y como segundo al valor asociado. También pudieron ser listas en lugar de tuplas.

Extra: Una forma de convertir una lista, una tupla o un conjunto sólo con cadenas como elementos, en una cadena es mediante el método join(), el cual tiene la sintaxis: separador.join(estructura_datos).

roca_s = ['Roca', 'sedimentaria', "caliza"]
x = "-".join(roca_s)
print(x)

>> Roca-sedimentaria-caliza

El separador entre comillas es el guion medio, pero puede dejarse un espacio como cualquier otro carácter o incluso nada, en este caso el resultado aparecería todo junto.

Y recuerda, ya vimos cómo convertir una cadena en una lista con el método split.

Recuerda visitar mi patreon: https://www.patreon.com/ciencias_tierra.

Ya vimos cinco estructuras de datos. En la siguiente sección verás las estructuras de control, con las cuales podrás sacar más provecho de las estructuras que viste en ésta y la sesión anterior.

Ejercicios

2.9 - Preguntas de repaso. Trata de responderlas sin ejecutar una sola línea donde sea posible.*

a) ¿Qué estructuras de datos tienen orden, y cuáles no tienen sus elementos ordenados?

b) ¿Qué ventaja computacional tiene el diccionario frente a las listas y tuplas?

c) Menciona 3 características propias de un conjunto.

d) ¿Cuál es la diferencia entre append() y extend() en una lista en Python?

e) ¿Cómo se verifica si una clave existe en un diccionario?

2.10 - Crea un diccionario llamado mis_datos donde las claves sean nombre, apellido_p, pais_origen y ciudad_origen; y los valores sean tus datos: nombre o nombres, apellido paterno, país y ciudad de origen. Imprime e interactúa con el diccionario.*

2.11 - Crea un diccionario donde las claves sean los 10 minerales de la escala de Mohs: Talco, Yeso, Calcita, Fluorita, Apatita, Feldespato, Cuarzo, Topacio, Corindón, Diamante; y los valores sean su respectivo valor numérico asociado. Están ordenados de menor a mayor.*

2.12 - Agregar a los datos capturados del diccionario hecho en el ejemplo 2.1 la nueva columna Estados que abarca. Pero a diferencia del ejemplo, ahora los valores del diccionario deben ser tuplas, y el grupo de estados una tupla anidada.**

Y al ejecutarse algunas consultas se deben ver como los siguientes ejemplos:

provincias_petroleras['Burgos']

>> (‘Gas no asociado’, ‘Jurásico Superior’, ‘Anticlinales tipo roll-over’,
>> (‘Nuevo León’, ‘Tamaulipas’))

provincias_petroleras['Cuencas de Sureste'][0]

>> ‘Aceite’

provincias_petroleras['Cinturón Plegado de la Sierra Madre Oriental'][3][4]

>> ‘Tamaulipas’

Observa cómo se puede acceder a los datos mediante los índices como lo hemos visto en las últimas sesiones.

--

--

Damian

Anything I want and is related to data. Learning to become a Data Professional.