1. Aprendiendo a Programar en
… con mi computadora y todo lo que
encuentre disponible.
Ejercicios
parte 5.
2. Ordenar las listas.
Puede interesar que los elementos de
una lista estén ordenados: una vez
que finalizó la inscripción en un curso,
tener a los listados de los alumnos por
orden de llegada puede ser muy
incómodo, siempre será preferible
tenerlos ordenados por número para
realizar cualquier comprobación.
3. Para dejar la lista original intacta y obtener
una nueva lista ordenada a partir de ella, se
usa la función sorted:
>>> bs=[5,2,4,2]
>>> cs=sorted(bs)
>>> bs
[5, 2, 4, 2]
>>> cs
[2, 2, 4, 5]
Ordenar listas.
4. Para modificar directamente la lista original
use la operación sort() sobre dicha lista:
>>> ds=[5,3,4,5]
>>> ds.sort()
>>> ds
[3, 4, 5, 5]
Ordenar listas.
5. Para obtener las palabras (separadas entre sí
por espacios) que componen la cadena xs
escriba simplemente xs.split():
>>> c = " Una cadena con espacios "
>>> c.split()
[’Una’, ’cadena’, ’con’, ’espacios’]
split elimina todos los blancos de más, y
devuelve sólo las palabras que conforman la
cadena.
Split sobre las listas.
6. Si en cambio el separador es otro carácter
(por ejemplo arroba, "@"), se le debe pasar
como parámetro a la función split. En ese
caso se considera un componente todo lo que
se encuentra entre dos arrobas consecutivas.
En el caso particular que el texto contenga
dos arrobas una a continuación de la otra, se
devolverá un componente vacío:
Split sobre las listas.
9. Listas.
Escribir una función que reciba como
parámetro una cadena de palabras
separadas por espacios y devuelva,
como resultado, cuántas palabras de
más de cinco letras tiene la cadena
dada.
10. #!/usr/bin/env python
# encoding: latin1
def busqueda_con_index(xs, x):
"""Busca un elemento x en una lista xs
si x está en xs devuelve xs.index(x)
de lo contrario devuelve -1"""
if x in xs:
return(xs.index(x))
else:
return(-1)
Búsqueda usando index e in.
11. >>> busqueda_con_index([1, 4, 54, 3, 0, -1], 3)
3
>>> busqueda_con_index([1, 4, 54, 3, 0, -1],
44)
-1
>>> busqueda_con_index([], 0)
-1
Búsqueda usando index e in.
12. #!/usr/bin/env python
# encoding: latin1
def busqueda_lineal(lista, x):
""" Si x está en lista devuelve su posición en
lista, de lo contrario devuelve -1. """
# Se recorren uno a uno los elementos de
# la lista y se les compara con el valor
# buscado.
# i es la posición actual en la lista, inicia = 0
i = 0
# el ciclo for recorre los elementos de lista:
Búsqueda usando index e in.
13. for z in lista:
# en la posición i, z contiene el valor de
# lista[i]
# si z es igual a x, devuelve i
if z == x:
return i
# si z es distinto de x, incrementa i, y
# continúa el ciclo
i=i+1
# si salió del ciclo sin haber encontrado el
# valor, devuelve -1
return -1
Búsqueda usando index e in.
15. 1. La búsqueda inicia en toda la lista completa.
2. Si el punto medio del segmento (valor central),
es el buscado, se devuelve su índice.
3. Si el valor central es mayor al buscado,
descarte el segmento desde el punto medio
hacia la a derecha.
4. Si el valor central es menor al buscado,
descarte el segmento desde el punto medio
hacia la izquierda.
5. Descartado el segmento sin interés, vuelva
analizar el segmento restante.
6. Si el segmento a analizar tiene longitud 0 o
negativa, el valor buscado no está en la lista.
Búsqueda binaria.
16. Búsqueda binaria.
Para señalar la porción del segmento
que se está analizando a cada paso,
se usan dos variables (izq y der) que
contienen las posiciones inicial y final
del segmento que se está
considerando. La variable medio
contiene la posición del punto medio
del segmento.
17. #!/usr/bin/env python
# encoding: latin1
def busqueda_binaria(lista, x):
"""Búsqueda binaria. Precondición: lista está
ordenada. Devuelve -1 si x no está en lista
Devuelve p tal que lista[p] == x, si x está en
lista """
# Busca en toda la lista dividiéndola en
# segmentos y considerando a la lista
# completa como el segmento que empieza en
# 0 y termina en len(lista) - 1.
izq = 0 # guarda el índice inicio del segmento.
der = len(lista) - 1
# guarda el índice fin del segmento.
Búsqueda binaria.
18. # un segmento es vacío cuando izq > der:
while izq <= der:
# el punto medio del segmento
medio = (izq+der)/2
print "DEBUG:", "izq:", izq, "der:", der, "medio:",
medio # si el medio es igual al valor buscado,
# lo devuelve
if lista[medio] == x:
return medio
# si el valor del punto medio es mayor que x,
# sigue buscando en el segmento de la
# izquierda: [izq, medio-1], descartando la
# derecha
Búsqueda binaria.
19. elif lista[medio] > x:
der = medio-1
# si no, sigue buscando en el segmento de la
# derecha: [medio+1, der], descartando la
# izquierda
else:
izq = medio+1
# si no salió del ciclo, vuelve a iterar con el
# nuevo segmento
# salió del ciclo de manera no exitosa: el valor
# no fue encontrado
return -1
Búsqueda binaria.
20. # Código para probar la búsqueda binaria
def main():
lista = input ("Dame una lista ordenada ([[]] para
terminar): ")
while lista != [[]]:
x = input("¿Valor buscado?: ")
resultado = busqueda_binaria(lista, x)
print "Resultado:", resultado
lista = input ("Dame una lista ordenada ([[]] para
terminar): ")
main()
Búsqueda binaria.
21. Un diccionario es una colección no ordenada
de valores que son accedidos a través de una
clave.
En lugar de acceder a la información mediante
el índice numérico, como es el caso de las
listas y tuplas, es posible acceder a los valores
a través de sus claves, que pueden ser de
diversos tipo.
Utilizando diccionarios.
22. Las claves son únicas dentro de un diccionario,
es decir que no puede haber un diccionario
que tenga dos veces la misma clave, si se
asigna un valor a una clave ya existente, se
reemplaza el valor anterior.
No hay forma directa de acceder a una clave a
través de su valor, y nada impide que un
mismo valor se encuentre asignado a distintas
claves.
Utilizando diccionarios.
23. La información almacenada en los diccionarios,
no tiene un orden particular. Ni por clave ni por
valor, ni tampoco por el orden en que han sido
agregados al diccionario.
Cualquier variable inmutable, puede ser clave
de un diccionario: cadenas, enteros, tuplas
(con valores inmutables en sus miembros), etc.
No hay restricciones para los valores
contenidos en el diccionario; pueden ser listas,
cadenas, tuplas, otros diccionarios, objetos,
etc.
Utilizando diccionarios.
24. Se puede utilizar un diccionario, por ejemplo,
para contar cuántas apariciones de cada
palabra hay en un texto, o cuántas apariciones
de cada letra.
Es posible usarlo, para una agenda donde la
clave es el nombre de la persona, y el valor es
una lista con los datos correspondientes a esa
persona.
Utilizando diccionarios.
25. También para mantener datos de alumnos
inscritos en una materia. Siendo la clave el
número de lista, y el valor una lista con todas
las notas asociadas a ese alumno.
En general, los diccionarios sirven para crear
bases de datos muy simples, en las que la
clave es el identificador del elemento, y el valor
son todos los datos del elemento a considerar.
Utilizando diccionarios.
26. Para definirlo junto con los miembros que va a
contener, se encierra el listado de valores entre
llaves, las parejas de clave y valor se separan
con comas, y la clave y el valor se separan con
’:’.
punto = {’x’: 2, ’y’: 1, ’z’: 4}
Utilizando diccionarios.
27. Para declararlo vacío y luego ingresar los
valores, se le declara como un par de llaves sin
nada en medio, y luego se asignan valores
directamente a los índices.
materias = {}
materias["lunes"] = [6103, 7540]
materias["martes"] = [6201]
materias["miércoles"] = [6103, 7540]
materias["jueves"] = []
materias["viernes"] = [6201]
Utilizando diccionarios.
28. Para acceder al valor asociado a una
determinada clave, se lo hace de la misma
forma que con las listas, pero utilizando la
clave elegida en lugar del índice.
print materias["lunes"]
Esto falla si se provee una clave que no está
en el diccionario. Es posible, por otro lado,
utilizar la función get, que devuelve el valor
None si la clave no está en el diccionario, o un
valor por omisión que se establece
opcionalmente.
Utilizando diccionarios.
30. Es posible recorrer sus claves y usar esas
claves para acceder a los valores.
for dia in materias:
print dia, ":", materias[dia]
Es posible, también, obtener los valores como
tuplas donde el primer elemento es la clave y
el segundo el valor.
for dia, codigos in materias.items():
print dia, ":", codigos
Utilizando diccionarios.
31. Para verificar si una clave se encuentra en el
diccionario, es posible utilizar la función
has_key o la palabra reservada in.
d = {’x’: 12, ’y’: 7}
if d.has_key(’x’):
print d[’x’] # Imprime 12
if d.has_key(’z’):
print d[’z’] # No se ejecuta
if ’y’ in d:
print d[’y’] # Imprime 7
Utilizando diccionarios.
32. diccionario.keys(): Devuelve una lista
desordenada, con todas las claves que se
hayan ingresado al diccionario.
diccionario.values(): Devuelve una lista
desordenada, con todos los valores que se
hayan ingresado al diccionario.
diccionario.items(): Devuelve una lista
desordenada con tuplas de dos elementos,
en las que el primer elemento es la clave y
el segundo el valor.
Utilizando diccionarios.
33. diccionario.pop(clave): Devuelve el valor
asociado a la clave, y elimina la clave y el
valor asociado del diccionario.
diccionario.popitem(): Devuelve un elemento
al azar del diccionario, representándolo
como una tupla (clave, valor) y elimina esta
pareja del diccionario.
diccionario.clear(): Elimina todos los
elementos del diccionario.
Utilizando diccionarios.