Está en la página 1de 28

CC 1002: Introducción a la Programación

Clase 17

Nelson Baloian, José A. Pino


Diccionarios Python
Estructura indexada mutable.
Los índices son llaves, que pueden ser cualquier tipo de dato inmutable
(ejs., strings y números).
>>> d={"hola":1,"chao":2}
Nota. Elementos/items de la forma identificador:valor
>>> d
{'chao': 2, 'hola': 1}
Nota. se muestran en orden arbitrario

>>> d["hola"] #identificador como índice


1

>>> "chao" in d
True
estructura fundamental en la ciencia de la computación
Más sobre diccionarios
>>> for p in d: print p #recorrer
identificadores
chao
hola
Nota. Se muestran en orden arbitrario (pero no aleatorio)

>>> d["adios"]=3 #agrega item "adios":3


>>> len(d)
3
>>> e=dict() #también e={}
>>> e
{}
>>> len(e)
0
Ejemplo: problema
Escribir un programa que lea un texto grabado en el archivo “texto.txt” y
muestre cada palabra con su frecuencia (número de apariciones).

ejemplo:
la casa esta en la zona de la casa rosada

resultados:
la 3
casa 2
esta 1
en 1
zona 1
de 1
rosada 1
¿ Como lo haríamos a mano ?
Solución con diccionario
D=dict()
for linea in open(raw_input("archivo?")):
#recorrer palabras de linea
for palabra in linea.split():
#si palabra existe, incrementar frecuencia
if palabra in D:
D[palabra]+=1
#si no existe, agregarla con frecuencia 1
else:
D[palabra]=1

#mostrar palabras y frecuencias


for palabra in D: #en orden arbitrario
print palabra, D[palabra]
Mismo problema, pero mostrar
ordenado
• clase dict no tiene función sort
• solución: convertir diccionario en lista Python

#convertir diccionario en tabla (lista de listas)


T=[]
#recorrer palabras del diccionario
for palabra in D:
#agregar lista [palabra,frecuencia]
T.append([palabra, D[palabra]])

#mostrar tabla ordenada por palabra


T.sort()
for lista in T:
print lista[0], lista[1]
Depuración de programas
“Debug”: sacar los bichos de un programa… depurar

Testear: comparar entrada y salida con la especificación


Depurar: estudiamos los eventos que hicieron surgir un error.

Es muchas veces imposible testear exhaustivamente. O al hacer testing de


integración… ¡aparece el error!
Ejemplo

Para una lista Python de enteros positivos, podemos definir una permutación
de ellos.

Ejemplo: [1, 2, 3, 4] ; una permutación es: [4, 1, 2, 3]

(es decir, son los mismos números, pero el orden ha cambiado).

También definimos una inversión en una permutación P dada, cuando, si i,j ε


P, tales que i<j entonces i aparece después que j en P.

Por ejemplo, en la permutación P = [4, 1, 2, 3], tenemos estas inversiones:


1 aparece después de 4,
2 aparece después de 4,
3 aparece después de 4.
Problema y una solución

Problema: Dada una permutación de números 1,…, n, encontrar el número


de inversiones que tiene.

Algoritmo de Lukas (o del que quieran :-) Para cada entero en la


permutación, si está ubicado a la derecha de la posición que le corresponde
en una secuencia ordenada ascendente, entonces sume al resultado la
distancia entre estas dos posiciones.

Ejemplo: [4, 1, 2, 3] tiene 0+1+1+1 = 3 => 3 inversiones


[3, 4, 5, 1, 2] tiene 0+0+0+3+3 = 6 => 6 inversiones

Si se programa el algoritmo, y se construyen asserts con los ejemplos, éstos


funcionan… ¿Está correcto el programa?
¡No!

Pruebe con la permutación [3, 2, 1]:

Algoritmo de Lukas: 0+0+2 = 2

Pero hay 3 inversiones: 1 aparece después que 2 y que 3, 2 aparece después


que 3…

  
Proceso de depuración: cuando hay
error
P1. ¿Por qué el programa ha producido este resultado?
(y no: ¿Por qué el programa no ha dado el resultado esperado?)
P2. ¿Será este error parte de una familia de errores?
(supuesto erróneo seguramente conduce a varios errores en el programa)
P3. ¿Cómo localizar y corregir el error?
Método científico para depurar
Hipótesis H: resultado a obtener es un resultado X.
Basta una sola oportunidad en que no se obtenga el resultado esperado para
que la hipótesis sea falsa!
Reproducibilidad de los resultados: - ¿qué pasa con los números al azar? (¡no
son realmente al azar!: son pseudo-aleatorios)
- Interacciones con usuarios.
Reducir espacio de búsqueda:
- Encontrar entrada más pequeña que conduzca a error…
- Encontrar parte del programa que es la más probable de ser “culpable”
Otra mirada a los strings
Los strings de Python también son estructuras indexadas.

Son inmutables.

str = “CC1002”
for c in str:
print c

genera:
C
C
1
0
0
2
Operaciones básicas sobre strings

>>> len(“abc”)
3
>>> “abc”+”def”
“abcdef”
>>> “la”*4
“lalalala”
>>> profesion = “ingeniero”
>>> “g” in profesion
True
>>> “f” in profesion
False
>>> “spam” in “abcspamdef”
True
Indexación y slicing de strings

>>> s[1]
“L”
>>> s[:3]
“SLI”
>>> s[:-1]
“SLICEOFSPA”
>>> s[-3:]
“PAM”
Ordenamiento y comparación
¿comparación?

lexicográfica: extensión de comparación alfabética para incluir todos los


caracteres

cada caracter tiene una representación numérica (binaria)

orden típico entre caracteres: espacio<dígitos<mayúsculas<minúsculas

signos y otros caracteres tienen representaciones arbitrarias

funciones min y max

ej: max(“pera”,”Pera”) entrega ‘pera’ porque ‘p’>’P’


Ejemplo
Problema. Leer una lista de palabras y escribir la mayor y la más larga (de
más letras). El fin de la lista se indica con la palabra “fin”

Ejemplo:

palabra(o fin)?gabriela
palabra(o fin)?jose
palabra(o fin)?rosa
palabra(o fin)?matias
palabra(o fin)?fin
mayor=rosa
más larga=gabriela
Programa para palabras
# leer una lista de palabras(que termina con “fin”) y
# escribir la mayor (alfabeticamente) y la más larga
# inicializar strings vacíos (de largo 0)
mayor = ""; masLarga = ""
# leer palabras hasta “fin”
while True:
palabra = raw_input("palabra(o fin)?") #lee string
if palabra == "fin": break
# mantener la palabra mayor
if palabra > mayor:
mayor=palabra
# mantener la palabra más larga
if len(palabra) > len(masLarga):
masLarga=palabra
#escribir resultados
print "mayor=", mayor
print "mas larga=", masLarga
Contar apariciones de un
carácter en un string
Ejemplo:
>>>cuenta(“a”,“abracadabra”)
>>>5

Una opción:
def cuenta(x,y):
n=0
for c in y:
if c==x:
n=n+1
return n
Solución recursiva
Ejemplo:
>>>cuenta(“a”,“abracadabra”)
>>>5

Solución recursiva
def cuenta(x,y):
if len(y)==0:
return 0
elif y[0]==x:
return 1+cuenta(x,y[1:])
else:
return cuenta(x,y[1:])
Funciones adicionales para strings
ejemplos: para s=’abracadabra’
x.find(y) busca y en x. Entrega índice s.find(“abra”) 0
de 1ª aparición (-1 si no está) s.find(“Abra”) -1
x.count(y) cuenta apariciones de y en x s.count(“abra”) 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 minúsculas por “casa”.upper() ‘CASA’
mayúsculas
x.lower() reemplaza mayúsculas por “Casa”.lower() ‘casa’
minúsculas
x.strip() elimina espacios al comienzo “ a b “.strip() ‘a b’
y fin
x.replace(y,z) reemplaza todos los y por z s.replace(‘abra’,’*’) ‘*cad*’

Sintaxis: string.nombre(parámetros)
Lista completa se obtiene con help(str)
Juego: obtener respuesta
si o no
Ejemplo de diálogo

me quieres? si o no? mmm…


me quieres? si o no? no sé
me quieres? si o no? si
yo no

Programa usando una función que obtenga una respuesta si o no

if siOno(“me quieres?”)==“si”:
print “yo no”
else:
print “adios mundo cruel”
Solución iterativa
# siOno: str -> str
# lee string de respuesta y detecta si es si o no
# devolviendolo. En caso contrario, vuelve a leer
def siOno(x):
while True:
resp=raw_input(x+" si o no?") #leer respuesta
resp=resp.strip() #eliminar espacios
resp=resp.lower() #traducir a minúsculas
if resp=="si" or resp=="no":
break
return resp
Solución recursiva
# siOno: str -> str
# lee string de respuesta y detecta si es si o no
# devolviendolo. En caso contrario, vuelve a leer
def siOno(x):
resp=raw_input(x+" si o no?").strip().lower()
if resp=="si" or resp=="no":
return resp
else:
return siOno(x)
Uso de funciones pre-definidas
Problema. Leer una línea que contiene “nombre apellido”

escribirlo en la forma “apellido,nombre”

Ejemplo:
nombre apellido?Juan Perez
Perez,Juan
Solución
linea=raw_input(“nombre apellido?”)

#buscar posición (índice) de espacio


i=linea.find(“ “)

#recuperar caracteres antes de espacio


nombre=linea[0:i]

#recuperar caracteres después de espacio


apellido=linea[i+1:]

#formar y escribir resultado


s=apellido + “,“ + nombre

print s
Conversiones de tipo
Conversión de números a String

>>> str(123)
'123'
>>> str(4.5)
'4.5'

Conversión de Strings a números

>>> int("123")
123
>>> float("4.5")
4.5
Para la próxima clase

(jueves)

Buscar en Wikipedia: Búsqueda


binaria, Ordenamiento

También podría gustarte