En esta serie de posts introduciremos conceptos básicos para almacenar y manipular datos utilizando Python y distintas librerías. El enfoque principal es poder llegar a manipular datos para crear un algoritmo inteligente.

Los datos a utilizar en inteligencia artificial se representan en matrices. En el siguiente ejemplo, tenemos una matriz de 4x3: 4 filas por 3 columnas.

Encabezado1 Encabezado2 Encabezado3
Dato1-1 Dato1-2 Dato1-3
Dato2-1 Dato2-2 Dato2-3
Dato3-1 Dato3-2 Dato3-3
Dato4-1 Dato4-2 Dato4-3

En este caso, la matriz es una estructura de 2 dimensiones, pues tiene filas y columnas. Esta será la representación más común a utilizar durante esta serie. Para comprender cómo crear una matriz de dos dimensiones, empecemos creando estructuras de una dimensión.

Listas

Una lista (list) es una variable que almacena datos de forma secuencial; es decir, importa el orden en el que se almacenan los elementos.

# Ejemplo de lista

mi_list = ['Gato', 'Perro', 'Caballo', 'Conejo', 'Cangrejo','asd']
print(mi_list)

Resultado:

['Gato', 'Perro', 'Caballo', 'Conejo', 'Cangrejo']

# Se accede a cada dato en la lista utilizando el índice (INDEX)
# en python, las posiciones se cuentan desde 0
print(mi_list[2])
print(mi_list[3])

Resultado:

Caballo
Conejo

# Al consultar un índice fuera del rango, obtendremos un IndexError
# Un IndexError siempre indica que el problema se relaciona a una lista
print(mi_list[5])

Resultado:

---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-11-9668198cd185> in <module>()
      1 # Al consultar un índice fuera del rango, obtendremos un IndexError
      2 # Un IndexError siempre indica que el problema se relaciona a una lista
----> 3 print(mi_list[5])


IndexError: list index out of range

Diccionarios

Un diccionario (dict) almacena datos utilizando claves (keys), donde cada clave tiene un nombre específico para identificar a cada valor.

# Ejemplo de diccionario
mi_dict = {
    'edad': 19,
    'nombre': 'Juan',
    'altura': 1.75
}
print(mi_dict)

Resultado:

{'edad': 19, 'nombre': 'Juan', 'altura': 1.75}

# Se accede a cada dato utilizando la llave
print(mi_dict['nombre'])
print(mi_dict['edad'])

Resultado:

Juan
19

# Al consultar una llave que no existe en el diccionario, obtendremos un KeyError
# Un KeyError siempre indica que el problema se relaciona a un diccionario
print(mi_dict['peso'])

Resultado:

---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-44-0276cce7f2d0> in <module>()
      1 # Al consultar una llave que no existe en el diccionario, obtendremos un KeyError
      2 # Un KeyError siempre indica que el problema se relaciona a un diccionario
----> 3 print(mi_dict['peso'])


KeyError: 'peso'

Creando variables de múltiples dimensiones

Al combinar las estructuras de datos de una dimensión, podemos generar estructuras de más de una dimensión.

# Las estructuras de datos pueden ser combinadas
# por ejemplo, un diccionario de listas
mi_comb = {
    'nombres': ['Juan', 'Pedro', 'Maria'],
    'edades': [20, 10, 15]
}
print(mi_comb['nombres'])
print(mi_comb['nombres'][1])
print(mi_comb['edades'][2])

Resultado:

['Juan', 'Pedro', 'Maria']
Pedro
15

En el ejemplo anterior, la primer dimensión se estructura en un diccionario y cada registro es una lista. Se puede decir que es una estructura de 2x3 porque la primer dimensión (el diccionario) tiene dos registros y la segunda (las listas) tienen tres registros.

# También se pueden crear listas de diccionarios
mi_otra_com = [
    {
        'nombre': 'Juan',
        'edad': 20
    },
    {
        'nombre': 'Pedro',
        'edad': 20
    },
    {
        'nombre': 'Maria',
        'edad': 15
    },
]

print(mi_otra_com)
print(mi_otra_com[1]['nombre'])
print(mi_otra_com[1]['edad'])

Resultado: [{‘nombre’: ‘Juan’, ‘edad’: 20}, {‘nombre’: ‘Pedro’, ‘edad’: 20}, {‘nombre’: ‘Maria’, ‘edad’: 15}] Pedro 20

En muchos lenguajes de programación, este tipo de estructuras de datos se conocen como estructuras anidadas. En Python existen muchas más estructuras para diferentes propósitos. La documentación oficial es un excelente punto de partida para aprender más sobre ellas. Además, esta maravillosa guía recopila la forma de realizar operaciones con las estructuras para sacarles el mayor provecho.

Primer ejemplo

Crear una lista de listas llamada nueva_lista que contenga 3 registros de 3 registros cada uno (el contenido no importa). Imprimir el segundo valor del segundo registro.

nueva_lista = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8]
]
print(nueva_lista[1][1])

Resultado:

4

Segundo ejemplo

Crear una lista de diccionarios con tres diccionarios, donde cada diccionario registre los valores para curso, inscritos y aprobados.

Luego imprimir:

  • la cantidad de inscritos en el tercer registro
  • la cantidad de aprobados en el último registro
  • el porcentaje de aprobados en el segundo registro
nueva_2 = [
    {
        "curso": "AI",
        "inscritos": 20,
        "aprobados": 15
    },
    {
        "curso": "Cálculo",
        "inscritos": 30,
        "aprobados": 10
    },
    {
        "curso": "Física",
        "inscritos": 27,
        "aprobados": 21
    }
]
print(nueva_2[2]["inscritos"])
print(nueva_2[2]["aprobados"])

#"aprobados" / "inscritos"
print(nueva_2[1]["aprobados"] / nueva_2[1]["inscritos"])


Resultado:

27
21
0.3333333333333333

Esa es la base del trabajo con listas y diccionarios. Las combinaciones y posibilidades a partir de aquí son casi infinitas, por lo que dejo a tu curiosidad seguir experimentando con ellas. Nos vemos en la siguiente parte de esta serie.