Escolar Documentos
Profissional Documentos
Cultura Documentos
Listas y Tuplas
0,1,...,n-1
Diccionarios
Los diccionarios son colecciones de datos que permiten definir y acceder a los componentes
mediante una clave. Cada componente de un diccionario es un par {clave: valor}.
Los diccionarios se indexan con claves, No se indexan mediante un rango numérico, como listas o
tuplas.
0,1,...,n-1
Se puede usar el operador in con diccionarios tal y como se lo hace con listas y tuplas para verificar
que una clave se encuentra en el diccionario.
No se pueden modificar las claves, pero si los valores asociados a las mismas.
Para agregar un nuevo par clave-valor se escribe la clave entre corchetes y se iguala al valor
Pregunta 4: Qué instrucción(es) debo utilizar para aumentar un estudiante al paralelo 14?
Pregunta 5: Cómo puedo saber cuántos estudiantes hay en el paralelo 20?
Pregunta 6: Cuál es el resultado de la instrucción print(paralelos['paralelo08'] ?
Pregunta 7: Qué instrucción(es) debo utilizar para crear un nuevo paralelo (Paralelo 40) sin ningún
estudiante?
Para obtener los datos de un diccionario se puede utilizar keys, values e items.
keys retorna las claves y values devuelve los valores, ambos son retornados en una estructura
específica de los diccionarios:
items retorna todos los datos del diccionario, donde cada elemento corresponde a una tupla (clave,
valor) :
Una vez obtenidos los datos de los diccionarios, se los puede recorrer con un lazo. Por ejemplo:
Taller
Si ya conoce el uso de archivos en Python seguir la opción (a) del taller, caso
contrario seguir la opción (b).
Determinar el vencedor en una batalla pokemon. Cada pokemon tiene un ID, nombre, tipo, y poder
de ataque.
En una batalla, el tipo de cada pokemon influye en su fuerza de ataque dependiendo del tipo del
adversario. Así, el ataque se puede duplicar (x2), demediar (x0.5) o anular (x0).
a)
El archivo pokedex.txt contiene el listado de los pokemones con sus datos:
ID|POKEMON|TYPE|ATK
El archivo tiposPokemon.txt contiene un listado de cada tipo y su efecto sobre otros tipos
de pokemones:
TYPE|SUPER - 2X|HALF - 0.5X|ZERO - 0X, donde SUPER, HALF y ZERO es el listado de
tipos que afectan el ataque, separados por '/'
b)
La lista pokedex contiene el listado de los pokemones con sus datos:
ID|POKEMON|TYPE|ATK
pokedex =['001|Bulbasaur|Grass|49\n', '002|Ivysaur|Grass|62\n', ...
, '721|Volcanion|Fire|110\n']
La lista tiposPokemon contiene un listado de cada tipo y su efecto sobre otros tipos de
pokemones:
TYPE|SUPER - 2X|HALF - 0.5X|ZERO - 0X, donde SUPER, HALF y ZERO es el listado de
tipos que afectan el ataque, separados por '/'
a)
cargarPokedex(nombreArchivo), que retorna un diccionario con los datos de los
pokemones:
{ ID:[POKEMON,TYPE,ATK]}
Por ejemplo:
{1:['Bulbasaur', 'Grass',49], …,8:['Wartortle', 'Water',63]}
b)
cargarPokedex(pokedexLista), que retorna un diccionario con los datos de los
pokemones:
{ ID:[POKEMON,TYPE,ATK]}
Por ejemplo:
{1:['Bulbasaur', 'Grass',49], …,8:['Wartortle', 'Water',63]}
El poder de ataque de cada pokemon se multiplica por el factor determinado por las listas SUPER,
HALF y ZERO (si el tipo del oponente se encuentra en dichas listas) y el vencedor es el de mayor
ataque resultante. Por ejemplo:
batallaPokemon(1,8,pokedex,dicTiposPokemon)
1:[Bulbasaur,Grass,49]
'GRASS': [['GROUND', 'ROCK', 'WATER'], ['BUG', 'DRAGON', 'FIRE', 'FLYING', 'GRASS',
'POISON', 'STEEL'], ['']]
Water (tipo del oponente) se encuentra en la lista SUPER, por lo tanto el ataque de
Bulbasaur se multiplica por 2.
Ataque = 49 * 2 = 98
8:[Wartortle,Water,63]
'WATER': [['FIRE', 'GROUND', 'ROCK'], ['DRAGON', 'GRASS', 'WATER'], ['']]
Grass (tipo del oponente) se encuentra en la lista HALF, por lo tanto el ataque de Bulbasaur
se multiplica por 0.5
Ataque = 63 * 0.5 = 31.5
98 >31.5 -> Vencedor: 1 – Bulbasaur. (La función retorna el ID del vencedor o 0 si es empate)
El programa principal debe cargar los diccionarios requeridos de las listas (o de los archivos
'tiposPokemon.txt' y 'pokedex.txt'), luego debe seleccionar 2 pokemones al azar y mostrar en pantalla
los siguientes datos de la batalla:
-- Batalla Pokemon --
Equipo Azul: ID1 - NOMBRE_POKEMON1 de tipo: TIPO1 y ataque: ATAQUE1
Equipo Rojo: ID2 - NOMBRE_POKEMON2 de tipo: TIPO2 y ataque: ATAQUE2
Vencedor: NOMBRE_POKEMON (o EMPATE)
cargarPokedex
a)
La función cargarPokedex recibe como parámetro el nombre del archivo que contiene los
datos de pokemones. Como sabemos cuál es el nombre por defecto del archivo, se lo ha
designado como parámetro clave.
Dentro de la función se procede a abrir el archivo en modo lectura y se lee la primera línea, la
cual contiene la cabecera y no se utiliza en este caso particular.
b)
Se definen las funciones getPokedex y getTiposPokemon, que retornan las listas por defecto.
def getPokedex():
return ['001|Bulbasaur|Grass|49\n', '002|Ivysaur|Grass|62\n', ... ]
def getTiposPokemon():
return ['DRAGON TYPE|DRAGON|STEEL|FAIRY\n', ... ]
La función cargarPokedex recibe como parámetro el nombre la lista que contiene los datos
de pokemones. Como podemos obtener la lista de defecto con getPokedex(), se lo ha
designado como parámetro clave.
diccionario = { }
Luego se procede a leer los datos del archivo (o la lista), línea por línea, por medio de un lazo for.
En cada iteración se elimina el caracter correspondiente al fin de línea por medio de strip (el valor por
defecto es ‘\n’) y se convierte la línea string a una lista, cuyos elementos van a ser definidos por el
limitante '|'. Por ejemplo, la línea '001|Bulbasaur|Grass|49\n' pasa a ser la lista
['001','Bulbasaur','Grass','49'], almacenada en la variable datos. Como el ataque es un tipo numérico
se procede a realizar el casting respectivo.
Luego, se almacenan los datos en el diccionario. La clave debe ser un valor numérico
correspondiente al código (datos[0]), mientras que el valor es una lista con el nombre, tipo y ataque
(datos[1], datos[2], datos[3]). Consecuentemente, se asignan los datos al diccionario realizando un
casting para la clave y el slicing respectivo para el valor
archivo.close()
return diccionario
cargarTipos
La función cargarTipos tiene la misma lógica para leer los datos de la fuente (archivo o lista), la
diferencia se da al llenar el diccionario dentro del lazo for.
En cada iteración se elimina el caracter correspondiente al fin de línea, se convierte la línea string a
una lista y cada elemento de la lista se la almacena en una variable (tipo, doble, mitad, cero).
De la variable tipo, solamente nos interesa lo que está por delante de ' TYPE' por lo que se realiza el
slicing correspondiente (se descartan los 5 últimos caracteres).
Luego, se almacenan los datos en el diccionario. La clave debe ser el tipo, mientras que el valor es
una lista de las listas doble, mitad y cero. Consecuentemente, se crean listas a partir de las variables
de tipo string, por medio de split('/') y cada una de estas listas pasa a ser un elemento de la lista que
se asigna como valor del diccionario.
archivo.close()
return diccionario
seleccionarPokemones
batallaPokemon
def batallaPokemon(IDpokemon1,IDpokemon2,pokedex,dicTiposPokemon):
tipo1 = pokedex[IDpokemon1][1].upper()
tipo2 = pokedex[IDpokemon2][1].upper()
ataque1 = pokedex[IDpokemon1][2]
ataque2 = pokedex[IDpokemon2][2]
Luego, se determina si el tipo de un pokemon se encuentra en alguna de las listas (doble, mitad o
cero) que son afectadas por el tipo del pokemon oponente. De ser ese el caso, se procede a
recalcular el ataque del pokemon oponente
Finalmente, se retorna el ID del pokemon con mayor ataque, si ambos ataques son iguales se retorna
0.
if ataque1 > ataque2:
return IDpokemon1
if ataque2 > ataque1:
return IDpokemon2
return 0
Programa Principal
Previo a iniciar el programa principal, se organizan todas las funciones en módulos, según su
afinidad.
El programa principal (autonomo7.py) importa los módulos requeridos y hace uso de las funciones
previamente declaradas
'''
#cargar diccionario desde listas
pokedex=lista.cargarPokedex()
dicTipos=lista.cargarTipos()
'''