Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Certamen 2
Leonardo Ramírez
• Estructuras de Datos: Listas, Tuplas, Diccionarios y conjuntos
• Función Range
• Ciclo for (recorrer)
• Match o Coincidencia
• Funciones Avanzadas
Estructuras Datos
Son una utilidad de Python dispuesta para almacenar y guardar cualquier tipo de Dato, tanto
así que pueden contenerse entre sí. Cada una posee un tipo de paréntesis, asiéndolos fácil
de identificar.
Como se ve, las listas pueden contener otra lista en su estructura, esto pasa con todas las
estructuras de Datos.
a = [5, 1, 4] a = [5, 1, 4]
b = a b = list(a)
b[0] = 1000 b[0] = 1000
a => [1000, 1, 4] a => [5, 1, 4]
MALO CORRECTO
Operador Comando Observación/Descripción
Este comando sirve tanto como para crear una lista vacía:
Crear lista=list() a=list(), como enlistar algo : a=list((1,2,3,4,5))
Agregar elemento lista.append(x) Este comando agrega un elemento a la lista en su ultima posición
Conseguir elemento por
posición Elemento=lista[posición] Permite obtener fácilmente un elemento, sabiendo su posición
Concatenar listas Lista1+lista2 Similar a sumar strings. No es conmutativo y guarda el orden.
Al igual que muchas funciones, esta se debe asignar a un valor si se quiere guardar,
aunque su uso más recurrente para este curso será dentro de un ciclo for. Estas dos juntas,
tienden a sustituir a los contadores en los programas; aunque ambos tienen características
diversas en otros casos.
Se debe tener mucho cuidado con la sintaxis del range, una mala distribución de
parámetros puede provocar no solo errores al correr, sino que la eliminación de otras
variables a su paso.
• Cuando al range se le asigna un solo dato, este seria el dato de llegada(este no se incluye en la lista):
• Cuando se le pasan dos datos, al primero se le llama el dato inicio, y el segundo el de llegada:
• Cuando al range se le pasan datos, van en este orden, Inicio, llegada, y salto. Este ultimo es cuanto se le suma al de
inicio hasta que llegue al ultimo. (En las dos anteriores por default es de 1):
• Cuando el dato de inicio es mayor al dato de llegada, la lista queda vacía, pero no tira error: range(3,1)>>> []
Tuplas ( )
Estructura de Datos caracterizada por su manera de guardar datos en paquetes, y su
imposibilidad de modificarse propiamente.
Las tuplas se ocupan para dejar datos anexados entre si: fechas de nacimientos, nombres
de alumnos, ruta de viaje, etc. De manera que la tupla sea una “estructura tipo”. Por
ejemplo, yo quiero guardar todas las fechas de los cumpleaños de mis amigos, así que
guardare todos estos de datos en tuplas de forma que sea (“nombre”,”día”,”mes”):
cumpleaños=[(“Pedro”,”01”,”Abril”),(Luis,”22”,”Mayo”),(”Leo”,”12”,”D
iciembre”)]
La organización-tipo será el uso más practico para las tuplas durante el curso.
Operador Comando Observaciones
Tipear tuple(x) Convierte a la estructura x en una tupla
Desempaquetar elemento1,elemento2,... =tupla Más útil cuando organizas todas tus tuplas en el mismo
esquema; y cuando su extensión es breve.
Conseguir por tupla[posición] Este comando trabaja mejor cuando tus tuplas siguen cierto
posición esquema de orden, ya que al sacar un elemento por posición,
siempre sabrás cual será la salida.
Comparar tupla1==tupla2 Ojo con este comando, solo será True, si todos los elementos
y posiciones son iguales.
Concatenar tupla1+tupla2 Junta las tuplas, en el orden dado.
len(tupla) Obtiene cuantos elementos tiene la tupla.
Extensión(largo)
Multiplicar tupla*entero Concatena una tupla consigo misma una cierta cantidad de
veces
Pertenencia elemento in tupla True si el elemento está en la tupla
Cantidad tupla.count(elemento) Obtiene cuantas veces se encuentra el elemento en la tupla.
El aspecto de los diccionarios es muy particular comparado con el resto de las estructuras
de datos, puesto a que poseen una sintaxis peculiar: diccionario={llave:dato,llave2:dato,…}
Los diccionarios son excepcionales para ir guardando muchos datos que se necesitan ir
relacionando entre ellos a medida que se obtiene la información. Para esto, existe un
método especial para ir guardando estos datos de a uno, en una lista, conjunto, suma o
contador (Ver diccionarios avanzados en paltitas).
Operador Comando Observación
Crear D=dict() Como en todas las estructuras, el diccionario tiene su propia abreviación de tipo en
python.
Acceder a valores D[llave] Este es el comando fundamental de diccionarios; con el, se puede acceder a
cualquier dato del diccionario
Modificar/agregar D[llave]=Dat Si a un dato se le asigna una llave inexistente, se crea el vinculo llave-dato; si
dato o existía, se modifica.
Eliminar elementos del D[llave] Para eliminar una llave con su dato respectivo. Revisa bien para no eliminar llaves
importantes.
Largo len() Cuenta la cantidad de llaves del diccionario, independiente de su elemento.
Lista de Llaves dict.keys() Forma una lista con todas las llaves de un diccionario. No se repiten entre si.
Lista de valores dict.values( Forma una lista con todos los valores del diccionario. Si se pueden repetir entre sí.
)
Conjuntos set( )
Un conjunto es una colección sin orden de valores no repetidos. Los conjuntos de Python
son análogos a los conjuntos matemáticos. El tipo de estructura que representa a los
conjuntos se llama set. El tipo set es mutable: una vez que se ha creado un conjunto, puede
ser modificado.
Los conjuntos no incluyen elementos repetidos, y que los elementos no quedan en el mismo
orden en que fueron agregados. Entonces, si tienes una lista y quieres sacarle los repetidos,
pásala a conjunto y de vuelta a lista.
Crear set() Comando para transformar estructuras o crear un conjunto vacío (c=set() ).
Esta sintaxis es parecida a la del while e if, ya que no necesita una asignación y se realiza en una línea
singular del programa, seguido de : ; sin embargo, el ciclo for no recibe ninguna condición, por lo que
es simplemente un ciclo que recorre todos los datos de la estructura hasta su término, cuando sucede
esto, el ciclo termina. Puede variar su sintaxis si la estructura es una tupla(*).
Lo que realiza el ciclo for, es asignar la variable a un dato de la estructura a la vez, en cierto orden:
por posición si es lista o tupla, o al azar si es un conjunto o diccionario.
Esto lo hace muy útil al momento de hacer combinaciones u operar estructuras, ya que ahorra la
necesidad de ocupar un while, un contador y una asignación por posición, que no es posible en todas las
estructuras.
Ejemplo
Se necesita recorrer una lista de tuplas con la estructura [(Número, cuadrado),…] como por ejemplo:
L=[(1,1),(2,4),(3,9),(4,16),(5,25),…] para generar una nueva lista, que tenga la estructura
[(Número,Cuadrado,Cubo),…]. Para obtener los datos, se debe recorrer la lista, obtener el número en la
posición 0, elevarlo al cubo, y añadir lo tres datos obtenidos en una tupla, y esta a una lista nueva.
Q=[]
for numero,cuadrado in L:
cubo=numero**3
Q.append((numero,cuadrado,cubo))
En un ciclo for, las tuplas se pueden desempaquetar, colocando las variables de cada dato a asignar en
vez de solo una. Dentro del ciclo, el programa correrá secuencialmente al igual que en un ciclo while,
hasta llegar al final y volver a empezar. A una vuelta en un ciclo for se le llama iteración. A diferencia del
while, el ciclo for termina cuando allá recorrido todos los elementos de la estructura de datos dada, ni
antes ni después.
Patrones Comunes:
Match o coincidencia
A diferencia de los algoritmos comunes ya conocidos, tales como el contador, suma,etc. Que se basan en
la compilación de cierta información, este Algoritmo está centrado como un método de búsqueda de esa
información, para generar una relación entre distintas estructuras de datos a través de una clave. Supón
tienes las dos listas a continuación:
Rol=[(“Leo”,“201660620-3”),(“Pedro”,”201555001-7”),(“Renzo”,”201655089-1”),…]
Notas=[(”201655089-1”,55),(”201555001-7”,30),(“201660620-3”,100) ]
La manera de relacionar estas listas es a través de un Match. Esto se logra debido a que hay un dato
clave, presente en ambas listas, en este caso el nombre. Si yo tengo la relación Nombre-Rol, y la relación
Rol-Nota; podré hacer posible la relación Nombre-Nota. Esto es posible siempre y cuando haya un dato
clave presente en estas dos lista.
Las llamadas recursivas suelen ser muy útiles, pero debido a su facilidad de caer en
iteraciones infinitas, deben utilizarse solo cuando sea necesario.
Las funciones recursivas siempre deben tener dos o más return, y a lo menos uno “fijo”, o
sea, que retorne un valor sabido a priori (no recursivo).
Funciones con parámetros por omisión
¿Como la función range puede aceptar desde uno hasta tres parámetros sin tirar error? Porque es una
función con parámetros por omisión.
Una función tiene parámetros por omisión cuando puede recibir una diversa cantidad de estos, y
dependiendo de esta cantidad, asume valores por default, un ejemplo sería:
def f1(a,b=2,c=1):
return (a**b)%c
print f1(2), f1(2,5), f1(2,5,9)
>>>4 32 5
Ojo que todos los parámetros por omisión tienen que estar al lado derecho, o arrojará error:
Además, al igual que en todas las funciones, importará el orden de los parámetros puestos en la función,
por lo que fíjate muy bien en el orden tanto de los parámetros no definidos como en los por omisión.
Paltitas
[+Paltas, - Pera]
1. Búsqueda
2. Modificar
3. Ordenar
4. Diccionarios Avanzados
5. Condiciones Múltiples
Cada una de estas tiene una forma particular de resolverse, por lo que entender como se
hacen es crucial.
1)Búsqueda
Tipo más común de ejercicio.
Todos los ejercicios, en alguna medida, pertenecen a este tipo, sólo que en
muchos, la compilación de los datos es meramente el primer paso para realizar
su propósito último, como es el ordenar, modificar, condiciones múltiples.
Ejemplo Búsqueda
Supón tienes la lista de tuplas, y quieres buscar a todos los que tengan nota
mayor o igual a 55, por lo que debes generar un programa:
Notas=[(“Leo”,100), (“Javier”,80),(“Natalia”,70),
(“Diego”,55),(“Pedro”,30)]
Para ello, se debe filtrar los datos que me interesan según la condición que me
dan, y agregar los que cumplen esa condición.
2)Modificar
Notas=[(“Leo”,100),(“Javier”,80),(“Natalia”,70),(“Diego”,55),(“Pedro
”,30)]
Siempre que quieras modificar una estructura de datos, es recomendable siempre crear una
nueva, a la cual se le añadirán los datos que fueron modificados de la primera. Por lo que
simplemente debes recorrer la lista inicial, modificar los datos y luego agregarlos a la lista
nueva, entregando esta última como resultado. Este método debiera funcionar para todos
los casos. (Ver pregunta 2c 2015-2).
3)Ordenar
Notas=[(“Leo”,100),(“Javier”,80),(“Natalia”,70),(“Diego”,55),(“Pedro”,30)]
Cada vez que necesites hacer algo similar, simplemente agrega y vuelve a ordenar la lista.
La dificultad es que el parámetro de orden no esta en la primera posición de la tupla, por lo
que se necesitará generar otra lista con otra plantilla de tupla, para luego reordenarla y
volver a su plantilla original. Como ejemplo haremos el ejercicio de crear la función
agregar(Notas,nva_tupla) la cual debe retornar la lista Notas, ordenada y con la
nueva tupla que se quiere agregar. (Ver pregunta 2a del certamen 2016-1)
Primero simplemente agregamos la nva_tupla:
Notas.append(nva_tupla)
Ahora solo tendremos que volver a ordenar los parámetros, para ello organizamos la lista
como (nota,nombre).
L=[]
for nombre,nota in Notas:
L.append((nota,nombre))
Luego se debe volver al orden inicial; como el ciclo for al recorrer listas la recorre por
posición, la posición de la tupla no se vera afectado al invertirla otra vez, haciendo el mismo
procedimiento anterior:
Notas=[]
for nota,nombre in L:
Notas.append((nombre,nota))
return Notas
4) Diccionarios Avanzados
No es un tipo de ejercicio propiamente tal, sino que una forma de compilación a
base de un diccionario, donde este se caracteriza por poder guardar
cantidades aditivas de información en los datos de cada llave.
En otras palabras, se refiere a que cada llave posee como dato un elemento para
guardar aún más información, sin necesidad de usar listas o diccionarios extras.
Estos datos para guardar información suelen usarse como contadores,
sumas, listas o conjuntos, vinculados con la llave, los cuales se modificarán
durante el ciclo.
Además, se caracteriza por habilitar la modificación más amplia de diccionario,
usando los datos como pseudo variables: Dicc[llave]+=1 , Dicc[llave].append(x),
etc.
Ejemplo Diccionarios avanzados
Los diccionarios son la mejor estructura de datos para almacenar información, debido a su
naturaleza llave:dato. Debido a esto, es muy conveniente que estos datos sean también
una estructura, tales como un conjunto o una lista para almacenar más información por
llave. Supón se tiene el siguiente diccionario:
Colores={“Leo”:[“Azul”,”Verde”],”Pedro”:[“Rojo”,”Azul”],
”Renzo”:[“Verde”,”Rojo”],…}
Donde la llave es un nombre, y los datos una lista de sus colores favoritos, si se quisiera
hacer al revés, la llave es el color y el dato una lista de las personas a la que les gusta, se
necesitará usar un patrón para agregarlos a partir del primer diccionario. (Ver pregunta 2b
2015-1)
Se genera un diccionario nuevo, se recorre el diccionario inicial para tener los pares llave-
dato, como estos datos son listas, también se deben recorrer uno a uno. Con esta
información, se irá escribiendo el diccionario nuevo a medida que se vaya recorriendo el
otro.
alumnos=[('11111111-1’,101),('22222222-2’,102),('12345678-9’,101),(‘12908321-
1’,103),('14909876-k’,102),('16342768-2’,101),('18324768-1’,103),('19546987-
9’,’101),('19321901-3’,103),('18567091-5’,102),('18618137-8’,101)('18462819-
4’,102)]
Final=('11111111-1’,55),('22222222-2’,77),(’12908321-1’,65),('16342768-
2’,100),('19321901-3,60), ('18567091-5’,90),('18462819-4’,59),('12345678-
9’,40),('14909876-k’,54),('18324768-1’,10),('19546987-9’,0),('18618137-8’,30)]