Está en la página 1de 12

Solución ejercicio

estructura.mutable("registro","nombre fono")
agenda=[registro("a",2),registro("c",1),registro("d",4)]

#buscar: str list(registro) -> int


#buscar nombre en agenda y devolver fono
#None si no esta
#ej: buscar("c",agenda)->1

def buscar(nombre,agenda):
for reg in agenda:
if reg.nombre==nombre: return reg.fono
return None

assert buscar("c",agenda)==1
Solución recursiva
estructura.mutable("registro","nombre fono")
agenda=[registro("a",2),registro("c",1),registro("d",4)]

#buscar: str list(registro) -> int


#buscar nombre en agenda y devolver fono
#None si no esta
#ej: buscar("c",agenda)->1

def buscar(nombre,agenda,i=0):
if i>=len(agenda): return None
reg=agenda[i]
if reg.nombre==nombre: return reg.fono
return buscar(nombre,agenda,i+1)

assert buscar("c",agenda)==1
Algoritmos de búsqueda
• Búsqueda secuencial (o lineal)
– iterativa (con inst for) o recursiva
– ¿n° de comparaciones? O(n) “del orden de n”
– ej: ~512 comparaciones para lista de n=1024
– Si lista ordenada, se puede optimizar
• Búsqueda binaria
– solo para lista ordenada
– divide sucesivamente la lista en dos mitades
– recursiva o iterativa (con instrucción while)
– ¿n° de comparaciones? O(log2n) “del orden de log2n”
– ej: ~10 comparaciones para lista de n=1024
Algoritmo de Búsqueda binaria

• ip, iu: índices del primer y último elementos


• si ip>iu, terminar (nombre no está en agenda)
• calcular im como índice de la mitad: (ip+iu)/2
• comparar nombre en índice im con nombre
buscado
• si es =, entonces devolver fono en índice im
• si es >, buscar en 1ª mitad (entre índices ip e im-1)
• si es <, buscar en 2ª mitad (entre índices im+1 e iu)
Búsqueda binaria recursiva

#ip, iu: índices del primer y último elementos


def buscar(nombre,agenda,ip=0,iu=len(agenda)-1):
#si ip>iu, terminar (nombre no está en agenda)
if ip>iu: return None
#calcular im como índice de la mitad
im=(ip+iu)/2
#comparar nombre en índice im con nombre buscado
c=cmp(agenda[im].nombre,nombre)
#si es =, entonces devolver fono en índice im
if c==0: return agenda[im].fono
#si es >,buscar en 1ª mitad (índices ip e im-1)
if c>0:
return buscar(nombre,agenda,ip,im-1)
#si es <,buscar en 2ª mitad (índices im+1 e iu)
else:
return buscar(nombre,agenda,im+1,iu)
Búsqueda binaria iterativa

def buscar(nombre,agenda):
ip=0; iu=len(agenda)-1
while ip<=iu:
im=(ip+iu)/2
c=cmp(agenda[im].nombre, nombre)
if c==0: return agenda[im].fono
if c>0:
iu=im-1
else:
ip=im+1
return None #no esta
Instrucción while
Sintaxis
while condición:
instrucciones

Semántica
Mientras condición se cumpla (sea True) ejecutar instrucción(es)

graficamente:

False
condición
True
instrucciones
Instrucción for
Sintaxis
for variable in lista: …

Semántica
indice=0
while indice<len(lista):
variable=lista[indice]

indice += 1 #indice=indice+1

Ejemplo
total=0 total=0
for numero in L: indice=0
total += numero while indice<len(L):
numero=L[indice]
total += numero
indice += 1
String (estructura indexada inmutable)
s=”casa”; S=”CASA” #asignación
a=s+S #”casaCasa” concatenación
len(s) #4 largo (nº de caracteres) de s
s<S #False comparacion
s[1:3] #”as” substring entre índices 1 y 2 (3-1)
‘a’ in s #True porque string “a” está en string “casa”
for c in s: print c #muestra c, a, s y a

def inverso(x):
s=””
for c in x: s=c+s
return s
assert inverso(“roma”)==”amor”

def inverso(x): #recursivo


if x==””: return ””
return inverso(x[1:])+x[0] #inverso(cola)+cabeza

def capicua(x): return x==inverso(x)


assert capicua(“reconocer”)
Funciones: devuelven otro string (no modifican original)
x.__add__(y) añade y al final de x s + “do” ‘casado’
x.find(y) índice 1ª aparición (-1 si no) s.find(“as”) 1
x.count(y) cuenta apariciones de y en x s.count(“a”) 2
x.isalpha() True si x es alfabético s.isalpha() True
x.isdigit() True si x es numérico s.isdigit() False
x.islower() True si x en minúsculas s.islower() True
x.isupper() True si x en mayúsculas s.isupper() False
x.upper() reemplaza por mayúsculas s.upper() ‘CASA’
x.lower() reemplaza por minúsculas “CASA”.lower() ‘casa’
x.strip() elimina espacios de izq y der “ a b “.strip() ‘a b’
x.replace(y,z) reemplaza todos los y por z s.replace(‘a’,’’) ‘cs’

def fraseCapicua(frase):
frase=frase.replace(“ “,””) #eliminar espacios
frase=frase.lower() #todo a minusculas
return capicua(frase)
assert fraseCapicua(“Anita lava la tina”)
Lista de listas (lista de 2 dimensiones, tabla, matriz)
ejemplo
T=[[“gabriela”,”jose”,”rosa”,”matias”], \ #fila 0
[62,48,56,49], \ #fila 1: lista de notas preg 1
[45,52,35,48] \ #fila 2: lista de notas preg 2
]
¿Construcción de una tabla?
#tabla inicialmente vacia
T=[]
#construir todas las filas
filas=n°; columnas=n°
for i in range(filas):
#agregar fila i inicialmente vacia
T.append([])
#agregar valores a fila i
for j in range(columnas):
… #obtener valor
T[i].append(valor) #al final de fila i
T=[["gabriela","jose","rosa","matias"],\
[62,48,56,49],\
[45,52,35,48]]

#promedios por pregunta (por filas)


for i in range(1,len(T)):
print "prom preg",i,sum(T[i])/len(T[i])

#promedios por alumno (por columnas)


for j in range(len(T[0])):
s=0.0
for i in range(1,len(T)):
s+=T[i][j]
print "prom",T[0][j],s/(len(T)-1)

Ejercicio. promedios por pregunta y alumno para


T=[[“gabriela”,62,45],\
[“jose”,48,52],\
[“rosa”,56,35],\

También podría gustarte