Colecciones en Python 3

Python como todos los lenguajes modernos integra un montón de colecciones para manejar datos, ya conocemos las listas pero en esta entrada aparecerán 3 nuevos tipos para cubrir otras necesidades.

1. Tuplas 

Son parecidas a las listas pero con la diferencia de que son inmutables, se utilizan para asegurarnos de que determinados datos no se pueden modificar.

# Declarar una tupla

tupla = (100,“Hola”,[1,2,3,4],-50)

En las tuplas también es posible hacer el uso del índice y slicing:

tupla[2:]

([1, 2, 3, 4], -50)

tupla[2][0]

1

Se puede hacer uso del .index como en las listas para buscar un elemento y saber su posición

tupla.index(100)

0

Si el elemento que hemos buscado en la tupla no lo encuentra devolverá el siguiente error:

ValueError: tuple.index(x):  x not in tuple

Otro método compartido con las listas es el count , para contar el número de elementos repetidos o no dentro de la tupla.

tupla.count(100)

1

tupla.count(‘Algo’)

0

Nota: La tupla no soporta el método append.

2. Conjuntos 

Son colecciones desordenadas de elementos únicos que se utilizan normalmente para hacer pruebas.

conjunto = {1,2,3}

Si añadimos por ejemplo el número 0, no se colocaría en la última posición como ocurriría con las listas, sino que estos conjuntos tienen un orden determinado colocando primero los números en orden y posteriormente los caracteres.

conjunto.add(0)

conjunto

{0, 1, 2, 3}

conjunto.add(‘H’)

conjunto

{0, 1, 2, 3, ‘H’}

Una situación que nos puede resultar útil el uso de conjuntos:

grupo = {‘Charlie’‘Juan’‘Mario’}

‘Charlie’ in grupo

True

‘Charlie’ not in grupo

False

Aunque la característica más importante de los conjuntos es que no pueden haber dos elementos duplicados en él:

test = {‘Charlie’,‘Charlie’,‘Charlie’}

test

{‘Charlie’}

# Automáticamente nos eliminaría los elementos duplicados, dejándolos solo una vez

Esta propiedad se podría explotar transformando colecciones a conjuntos eliminando así los datos duplicados:

  • Opción rudimentaria

# Una lista con varios elementos repetidos

l = [1,2,3,3,2,1]

# Transformamos la lista a conjunto

c = set(l)

c

{1, 2, 3}

# Y ahora volvemos a transformar este conjunto a una lista, para poder operar de una forma normal

l = list(c)

l

[1, 2, 3]

  • Opción optima

l = [1,2,3,3,2,1]

l = list( set( l ) )

Este concepto también funciona con cadenas de caracteres, por ejemplo:

s = “Al pan pan y al vino vino”

set(s)

{‘ ‘, ‘A’, ‘a’, ‘i’, ‘l’, ‘n’, ‘o’, ‘p’, ‘v’, ‘y’}

 

3. Diccionarios

Son junto a las listas las colecciones más utilizadas en python, se basan en una estructura mapeada donde cada elemento de la colección se encuentra identificado con una clave única.

colores = {‘amarillo’:‘yellow’, ‘azul’:‘blue‘, ‘verde’:‘green’}

# Ver el valor de una clave del diccionario

colores[‘azul’]

‘blue’

colores[‘amarillo’]

‘yellow’

# Cambiar un valor

colores[‘amarillo’] = ‘white’

# Eliminar una clave y su valor del diccionario

del(colores[‘amarillo’])

 

edades = {‘Charlie’:24 , ‘Juan’:45, ‘Maria’:34}

# Aumentar la edad de Charlie

edades[‘Charlie’] += 1

# Recorrer todos los elementos del diccionario con un for ( Claves )

for edad in edades:

print(edad)

# Ahora queremos recorrer las edades ( Valores )

for clave in edades:

print(edades[clave])

# O mostrar ambas cosas

for clave in edades:

print(clave,edades[clave])

O directamente más sencillo usar el método items que incluye el diccionario:

for c,v in edades.items():

print(c,v)

Maria 34

Charlie 25

Juan 45

Aunque lo más interesante es hacer uso de diccionarios junto a listas, como por ejemplo:

# Crear lista vacía

personajes = []

# Crear personajes en formato diccionario

p = {‘Nombre’:‘Gandalf’,‘Clase’:‘Mago’,‘Raza’:‘Humano’}

p1 = {‘Nombre’:‘Legolas’,‘Clase’:‘Arquero’,‘Raza’:‘Elfo’}

p2 = {‘Nombre’:‘Gimli’,‘Clase’:‘Guerrero’,‘Raza’:‘Enano’}

# Añadir a la lista los personajes

personajes.append(p)

personajes.append(p1)

personajes.append(p2)

# Mostrar la información de cada uno de ellos

for p in personajes:

print(p[‘Nombre’],p[‘Clase’],p[‘Raza’])

Gandalf Mago Humano

Legolas Arquero Elfo

Gimli Guerrero Enano

También existen otras dos estructuras de datos tradicionales como las pilas y las colas que no existen en python, pero pueden ser emuladas con listas.

Funcionamiento:

Una pila es una colección de elementos ordenados con la peculiaridad que permite dos acciones, añadir o sacar un elemento de la pila.

Siendo el último elemento en entrar, el primero en salir, esta estructura se denomina en ingles LIFO : Last In First Out.

 

Ejemplo práctico: Una pila de libros, vamos apilando libros y si queremos sacar el último libro tenemos que sacar los que están encima primero.

Para simular una pila en python:

# Declarar una lista normal

pila = [3, 4, 5]

pila.append(6)

pila.append(7)

pila

[3, 4, 5, 6, 7]

# Para sacar el último elemento que ha entrado en la lista hacemos uso del método pop

pila.pop()

[3, 4, 5, 6]

Por otro lado las colas tienen otro funcionamiento que se denomina en ingles FIFO – First In First Out.

El primer elemento en entrar es el primero en salir.

Como las colas no se suelen utilizar mucho, para trabajar con ellas debemos importar la colección manualmente de la librería de colecciones de python.

from collections import deque # Colocar esta línea al principio del fichero

cola = deque()

# Añadir elementos a la cola pasandole una lista

cola = deque([‘Charlie’,‘Juan’,‘Miguel’])

cola.append(‘Maria’)

cola.append(‘Arnaldo’)

cola

deque([‘Charlie’, ‘Juan’, ‘Miguel, ‘Maria’, Arnaldo’])

# Hacer un pop pero empezando por el principio , solo funciona en las deque

cola.popleft()

‘Charlie’

cola

deque([ ‘Juan’, ‘Miguel, ‘Maria’, Arnaldo’])

# Si no queremos perder el valor antes de eliminarlo podriamos guardarlos en una variable

p = cola.popleft()

p

‘Juan’

deque([ ‘Miguel, ‘Maria’, Arnaldo’])

Un ejemplo donde se utilizan las colas en la vida real es en los servidores web o de correo electrónico, en lugar de aceptar peticiones en tiempo real, lo que hacen es añadir estas peticiones a la cola y el servidor va mirando la cola y responde a las peticiones en el orden que han ido llegando.

Ejercicios resueltos

1. Realiza un programa que siga las siguientes instrucciones:

  • Crea un conjunto llamado usuarios con los usuarios MartaDavid, AlviraJuanMarcos.
  • Crea un conjunto llamado administradores con Juan Marta
  • Borra al administrador Juan del conjunto de administradores.
  • Añade a Marcos como un nuevo administrador, pero no lo borres del conjunto de usuario.
  • Muestra todos los usuarios por pantalla de forma dinámica, ademas debes indicar si cada usuario es administrador o no.

Nota: los conjuntos cuentan con un método llamado .discar(elemento) que sirve para borrar un elemento.

# Conjunto usuarios

usuarios = {“Marta”, “David”, “Elvira”, “Juan”, “Marcos”}

# Conjunto Administradores

administradores = {“Juan”, “Marta”}

#Eliminar a Juan de administradores

administradores.discard(“Juan”)

# Añadir a Marcos como administrador

administradores.add(“Marcos”)

# Mostrar usuarios de forma dinámica

for usuario in usuarios:

if usuario in administradores:

print(usuario, “es admin”)

else:

print(usuario, “no es admin”)

Marta es admin

Elvira no es admin

David no es admin

Marcos es admin

Juan no es admin

2. Durante el desarrollo de un pequeño videojuego se te encarga configurar y balancear cada clase de personajes jugable. Partiendo que la estadística base es 2, debes cumplir las siguientes condiciones:

  • El caballero tiene el doble de vida y defensa que un guerrero.
  • El guerrero tiene el doble de ataque y alcance que un caballero.
  • El arquero tiene la misma vida y ataque que un guerrero, pero la mitad de su defensa y el doble de su alcance.
  • Muestra como quedan las propiedades de los tres personajes.

caballero = { ‘vida’: 2, ‘ataque’: 2, ‘defensa’: 2, ‘alcance’: 2}

guerrero = { ‘vida’: 2, ‘ataque’: 2, ‘defensa’: 2, ‘alcance’: 2}

arquero = { ‘vida’: 2, ‘ataque’: 2, ‘defensa’: 2, ‘alcance’: 2}

#Caballero

caballero[‘vida’] = guerrero[‘vida’] * 2

caballero[‘defensa’] = guerrero[‘defensa’] * 2

#Guerrero

guerrero[‘ataque’] = caballero[‘ataque’] * 2

guerrero[‘alcance’] = caballero[‘alcance’] * 2

#Arquero

arquero[‘vida’] = guerrero[‘vida’]

arquero[‘ataque’] = guerrero[‘ataque’]

arquero[‘defensa’] = guerrero[‘defensa’] / 2

arquero[‘alcance’] = guerrero[‘alcance’] * 2

# Resumen

print(“Caballero:\t”, caballero)

print(“Guerrero:\t”, guerrero)

print(“Arquero:\t”, arquero)

Caballero:          {‘vida’: 4, ‘alcance’: 2, ‘ataque’: 2, ‘defensa’: 4}

Guerrero:          {‘vida’: 2, ‘alcance’: 4, ‘ataque’: 4, ‘defensa’: 2}

Arquero:          {‘vida’: 2, ‘alcance’: 8, ‘ataque’: 4, ‘defensa’: 1.0}

 

3. Durante la planificación de un proyecto se han acordado una lista de tareas. Para cada una de estas tareas se ha asignado un orden de prioridad (cuanto menor es el número de orden, más prioridad)

¿Eres capaz de crear una estructura del tipo cola con todas las tareas ordenadas pero sin los números de orden?

Nota: para ordenar una lista usar el método .sort()

tareas = [

[6, ‘Distribución’],

[2, ‘Diseño’],

[1, ‘Concepción’],

[7, ‘Mantenimiento’],

[4, ‘Producción’],

[3, ‘Planificación’],

[5, ‘Pruebas’]

]

# Importar deque

from collections import deque

# Ordenar

tareas.sort()

cola = deque()

for tarea in tareas:

cola.append(tarea[1])

# Print

print(“\n==Tareas ordenadas==”)

for tarea in cola:

print(tarea)

==Tareas ordenadas==

Concepción

Diseño

Planificación

Producción

Pruebas

Distribución

Mantenimiento

Autor entrada: CharlieJ

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *