Tipos de Datos
Tipos predefinidos
Python tiene sus propios tipos de datos predefinidos para facilitar el manejo y la organizacion de la data guardada en las variables, agrupándolas en estructuras más grandes y con diferentes propiedades.
El tipo de datos de una variable o estructura puede consultarse con la función type():
A continuacion se explican los tipos de datos estándar de Python.Listas (list
)
Estructura de datos para almacenar múltiples valores en secuencia. Se delimita con los corchetes ( []
). Los elementos se separan con comas. Se habitúa dejar un espacio entre cada coma y su elemento siguiente.
Los datos pueden ser de distintos tipos y pueden ser modificados tanto en valor como en tipo.
Ejemplo:
Para acceder a un elemento de la lista en base a su indice éste se indica entre corchetes: El primer índice tiene valor cero. Si el índice iguala o supera la longitud de la lista da error. Dicha longitud de la lista se puede obtener con la funciónlen()
(viene del inglés length):
Indices negativos
Se pueden usar indices negativos hasta la longitud máxima: índice -1
es el último valor, índice -2
es el penúltimo elemento, etc.
Ejemplo: si una lista tiene 10 elementos entonces el rango de índices permitidos va de -10 a 9.
Las listas pueden crearse vacías para ser completadas más tarde:
Las listas pueden ser definidas también usando la función list()
. Esta funcion también permite convertir otros tipos de datos a lista.
Ejemplo aplicacion: Matrices
Para hacer una matriz de valores se la puede construir en base a una lista que contenga a múltiples listas internas separadas con comas.
Métodos de las listas
Para añadir un nuevo elemento al final de la lista podemos usar el método append()
:
insert()
:
Para eliminar un elemento puede usarse el método remove()
.Éste elimina la primera aparición del método indicado. Si el elemento indicado no existe el método devuelve error.
Para eliminar un elemento por índice y poder retornarlo se usa el método pop()
.Si el elemento indicado no existe el método devuelve error.
elemento = lista.pop( ) # elimina el último elemento
elemento = lista.pop( indice ) # elimina el elemento por indice
La búsqueda de la posición de un elemento se hacer con el método index()
,el cual presupone que el elemento existe :
Tip: operador in
Para verificar la existencia de un elemento en la lista se puede usar el operador in
el cual devuelve un valor booleano.
Ejemplo de uso: eliminar elemento
Reescribir una posicion particular de la lista:
Contar repeticiones de un elemento: método count()
Concatenar una segunda lista al final de la primera: método extend()
Invertir el orden de los elementos (cambios persistentes): método reverse()
Eliminar todo el contenido de la lista:
Ordenar los elementos (cambios persistentes): método sort()
lista.sort() # Orden ascendente por defecto
lista.sort( reverse = True) # Orden descendente
lista.sort( key = funcion_ordenamiento) # Criterios personalizables mediante una funcion lambda
Los argumentos de entrada reverse
y key
permiten alterar el orden y el criterio de ordenamiento de la función:
reverse
: booleano que permite invertir el orden. EsFalse
por defecto.key
: función para especificar el criterio de ordenamiento de los elementos. Esta función debe aceptar un solo elemento de la lista como entrada. Por defecto esNone
.
Ejemplos de uso:
Ejemplos: ordenar una lista de strings con sort()
lista = ["aaa", "cccc", "bb"]
lista.sort()
print(lista) # '['aaa', 'bb', 'cccc']'
Copia y referencia de listas
Python permite apuntar a una lista preexistente con una simple asignación:
Si los elementos de la lista original son modificados entonces estos cambios se verán replicados en la lista de salida.
Ejemeplo: cambios sobre lista
# creacion de lista original
original = [ 1, "hola", True]
# la nueva lista muestra el mismo contenido que la oiginal
referencia = original # referencia
print(referencia) # '[1, 'hola', True]'
# al modificar la lista original la lista de salida cambia también
original[1] = "chau"
print(referencia) # '[1, 'chau', True]'
Si se requiere independizar una lista de la otra y así prevenir cambios imprevistos se recurre a la copia.
Tip: copia de listas
Las listas tienen varias opciones para la copia de los valores. Una de ellas es el método copy()
:
Copia superficial y copia profunda
Los métodos de copia descritos previamente son de copia superficial. Esto significa que se copian los valores de las variables internas, pero en caso de haber listas u otros tipos de datos en el interior éstos se pasarán por referencia y por tanto serán susceptibles a cambios.
La alternativa es la copia profunda, la cual copia recursivamente todo el contenido interno de la lista creando así una réplica totalmente independiente del original.
En Python se implementó para tal fin la función deepcopy()
:
Tuplas (tuple
)
Similar a las listas pero inmutables. Las tuplas se indican con paréntesis ( ()
) :
Las tuplas también pueden definirse mediante la función tuple()
.
Los métodos más habituales para trabajar con tuplas son count()
e index()
, este último combinado con el operador in
.
Conjuntos (set
)
Son una colección de elementos no repetidos y no ordenados. Para definirlos se usa la función set()
la cual descarta los elementos repetidos :
Los conjuntos también pueden ser inicializados con llaves ( {}
):
Los elementos de los sets no pueden ser consultados por índice.
Sets de strings
set()
trata las variables string como si fueran vectores de letras y por ello las descompone, devolviendo el conjunto de letras.
Ejemplo:
Para mantener los strings integros estos pueden agruparse dentro de una lista mediante corchetes:Métodos de los Sets
Para añadir y quitar elementos se puede usar los métodos add()
y remove()
:
Los conjuntos no pueden ser consultados por índice. Para vaciar por completo el conjunto se usa el método clear()
:
union()
Con el método difference()
se puede listar todos aquellos elementos del primer conjunto que no estén compartidos con el segundo:
Operadores de los Sets
Los conjuntos se pueden relacionar también con operadores:
Operacion | Retorno Elementos | Simbolo |
---|---|---|
Unión | todos | | |
Intersección | comunes | & |
Diferencia | no repetidos (del set izquierdo) | - |
Diferencia Simétrica | no repetidos (ambos sets) | ^ |
Ejemplo aplicado: operaciones sobre sets
# conjuntos de ejemplo
set_1 = {"A", "B", "C" , 1}
set_2 = {"A", 1, "X"}
# operaciones
union = set_1 | set_2 # {1, 'C', 'B', 'X', 'A'}
interseccion = set_1 & set_2 # {1, 'A'}
diferencia = set_1 - set_2 # {'C', 'B'}
diferencia_simetrica = set_1 ^ set_2 # {'C', 'B', 'X'}
Diccionarios (dict
)
Son colecciones de pares clave-valor. Los diccionarios se definen con llaves ( {}
) , el formato es el que sigue:
Las claves deben ser únicas e inmutables, y sirven para acceder a su valor asociado. Deben ser de tipo string
. Los valores pueden ser de cualquier tipo. Los pares clave-valor sí pueden ser modificados, añadidos y eliminados (son mutables).
Múltiples valores
Una misma clave puede tener múltiples valores agrupados en un tipo de datos acorde: una lista, una tupla, un set, un diccionario interno, etc.
Métodos y operadores
Para acceder a un valor del diccionario se lo busca por su clave, la cual debe ser preexistente:
Otra forma es usar el métodoget()
, el cual es más seguro :
Para añadir o modificar un par clave - valor se hace una asignación:
Para eliminar una clave se usa el operadordel
(delete):
La lectura de todas las claves de un diccionario se puede usar el método keys()
:
values()
:
La lectura de a pares clave-valor se hace con el método items()
:
objeto_items = diccionario.items() # objeto 'dict_items'
lista_items = list(objeto_items) # conversion a lista de tuplas clave-valor
Con el operador in
podemos chequear la existencia de una clave particular ó de un valor:
existe_clave = clave in diccionario # verificacion de clave directa
existe_valor = valor in diccionario.values() # lectura de valores previa
Para crear un nuevo diccionario con claves pero todas con valor None
existe el método fromkeys()
:
Tipado de datos
Los datos aquí analizados pueden ser tipados para ayudar a prevenir y corregir errores por incompatibilidad de tipos.
Datos simples
La notación básica es igual a la del tipado de variables :
Notación general:
Los datos y variables internas también se pueden tipar. Para ello se añade el uso de corchetes para delimitar los tipos de variables internas.
Ejemplos
Datos compuestos
El tipado también se puede usar para datos compuestos (), agrupando los tipos mediante corchetes.
Ejemplo de uso: tipado de diccionario
En este ejemplo se da tipado a un diccionario con claves de texto y listas de enteros como valor
El tipado detallado para datos puede ser un desafío debido a la variedad de datos y variables internos, especialmente cuando los datos son compuestos.
Recordar: tipado débil
Al igual que en el caso de las variables, el tipado manual es débil y no impide la ejecución del programa en caso de encontrarse inconsistencias.
Funciones para datos
Enumerar elementos - enumerate()
La función enumerate()
permite enumerar los elementos de una lista ,pero los convierte también a tupla. Require el uso de la función list()
para recuperar la data.
lista = [1, "hola", True]
objeto = enumerate(lista) # tipo 'enumerate'
enumerados = list(objeto) # conversion a lista
# da '[(0, 1), (1, 'hola'), (2, True)]'
El índice inicial es 0
salvo indicación contraria. El valor elegido de índice inicial se pasa como segundo valor de entrada para la función enumerate()
:
lista = [1, "hola", True]
indice_inicial = 27
objeto = enumerate(lista, indice_inicial ) # tipo 'enumerate'
enumerados = list(objeto) # conversion a lista
# da '[(27, 1), (28, 'hola'), (29, True)]'
El resultado final es una lista de tuplas que incluyen cada una un par indice-elemento. Ambos datos pueden extraerse fácilmente con la cláusula for
:
for indice, elemento in enumerados:
print(f"Indice: {indice}; elemento: {elemento}")
# texto en pantalla
# 'Indice: 27; elemento: 1'
# 'Indice: 28; elemento: hola'
# 'Indice: 29; elemento: True'
Más sobre la cláusula for
: control de flujo
Ordenamiento de datos - sorted()
La función sorted()
ordena los elementos de listas y diccionarios, por defecto de manera ascendente / alfabética.
lista_ordenada = sorted( lista ) # orden ascendente
lista_ordenada = sorted( lista, reverse=True ) # orden descendente
lista_ordenada = sorted( lista, key = funcion_ordenamiento ) # criterio de ordenamiento definido por función
sort()
de las listas, de hecho tiene los mismos argumentos de entrada (reverse
y key
). El resultado es una lista con los elementos.
Esta función también sirve para ordenar diccionarios:
lista_ordenada = sorted( diccionario ) # orden ascendente
lista_ordenada = sorted( diccionario, reverse=True ) # orden descendente
lista_ordenada = sorted( diccionario, key = funcion_ordenamiento ) # criterio de ordenamiento definido por función
La función presupone que el ordenamiento es por clave. Si en cambio se busca ordenar los elementos por valores hay que usar el método values()
:
lista_ordenada = sorted( diccionario.values() ) # orden ascendente
lista_ordenada = sorted( diccionario.values(), reverse=True ) # orden descendente
lista_ordenada = sorted( diccionario.values(), key = funcion_ordenamiento ) # criterio de ordenamiento definido por función
El resultado en estos casos es una lista de tuplas con los pares clave-valor.
Lectura desde archivo - eval()
Para poder convertir a diccionario una variable str
(por ejemplo, una lectura desde un archivo de texto) se usa la función eval()
:
Claves repetidas
Hay que tener cuidado de no repetir las claves porque sino se pierden los valores más antiguos.
Archivos JSON
Los archivos JSON están dedicados al guardado de pares clave-valor. Los diccionarios pueden guardarse y leerse en estos archivos con ayuda del módulo json
. Ir al tutorial sobre JSON