Ejercicios de Python
Curso de Bioinformática 2012
Ejercicio 1
Tipi contenitore
● Creare dupletto che rappresentino i due
elenchi de nombres y apellidos descritos a continuación:
nomi: Numa, Tullo, Anco
cognomi: Pompilio, Ostilio, Marzio
● Obtener unalista en la que cada elemento es un
dizionario{'nome': nome, 'cognome':
apellido}, que empareja nombres y apellidos en
base al pedido.
Solución 1
Tipi contenitore
>>>nomi = ('Numa','Tullo','Anco')
>>>cognomi = ('Pompilio','Ostilio','Marzio')
>>>l = []
>>>fornome, cognomeinzip(nomi,cognomi):
...[Link]({'nome': nome,'cognome': cognome})
...
>>>l
[{'cognome':'Pompilio','nome':'Numa'},
{'cognome':'Ostilio','nome':'Tullo'},
{'cognome':'Marzio','nome':'Anco'}]
Una posible alternativa:
>>>l = [{'nome': nome,'cognome': cognome}fornome,
cognomeinzip(nomi, cognomi)
Ejercicio 2
Tipi contenedor
● Crear undiccionario que contenga como
chiavi'nome'e'cognome', insertando los propios
datos como valores
Agregarmatrícula
● Añadir 'exámenes', intentando imaginar
qué tipos de dato usar para representar ambas
nombre de los exámenes
Solución 2
Tipi contenitore
>>>d = {'nome':'Pinco','cognome':'Pallino'}
>>>d['matricola'] =258115
>>>d['esami'] = [{'nome':'Bioinformatica','voto':30},
{'nome':'Analisi','voto':18}]
>>>d
{'nome':'Pinco','cognome':'Pallino','matricola':
258115,'esami':[{'nome':'Bioinformatica','voto': 30},
{'nome':'Analisi','voto': 18}]}
Una posible alternativa:
>>>d['esami'] = {'Bioinformatica':30,'Analisi':18}
>>>d
{'nome':'Pinco','cognome':'Pallino','matricola':
258115,'esami':{'Bioinformatica': 30, 'Analisi': 18}}
Ejercicio 3
Instrucción if
Escribir un programa que:
● prenda una cadena de entrada desde el teclado,
representante un nucleótido (A, C, G, T)
● stampi un video del nucleotide complementario
Asegúrese de que el programa funcione
CORRETTAMENTESIA CON INPUT MAIUSCOLO CHE
minusculo.
Solución 3
Instrucción if
nucleotide = raw_input('Inserisci un nucleotide (A,C,G,T):
')
si nucleotide == 'A' o nucleotide == 'a':
print'T'
elif nucleotide == 'C' or nucleotide == 'c':
imprimir 'G'
elifnucleótido =='G' o nucleótido =='g':
print'C'
elifnucleotide =='T'ornucleotide =='t':
imprimir 'A'
Una posible alternativa:
nucleotide = [Link]()
Ejercicio 4
Iteración
● Calcular lasommadei primi500numeri
naturales (de 0 a 500 excluido)
Solución 4
Iteración
>>>n =0
>>>para en rango(0,500):
...n += i
...
>>>n
124750
Posibles alternativas:
>>>sum(range(0,500))
124750
(499*500)/2# ¡Gauss!
124750
Ejercicio 5
Iteración
● Data la cadenaabcdefghi, escribir
un programa que analice la cadena y
stampi un video:
Carta 1: a
Carta 2: b
...
Y así sucesivamente.
● Modificaré luego el programa de modo que
leer la cadena desde el teclado.
Solución 5
Iteración
fori, letterinenumerate('abcdefghi'):
print 'Lettera %d: %s' % (i+1, letra)
s = input('Inserte una cadena: ')
fori, letterinenumerate(s):
print'Letra %d: %s'% (i+1, letra)
Ejercicio 6
Iteración
● Escribir un programa que imprima la
longitud de las cadenas proporcionadas por el usuario
hasta que el usuario no introduzca la cadena
salida
Solución 6
Iteración
mientrasVerdadero:
line = raw_input('Inserisci una stringa: ')
si línea =='salir':
descanso
imprimirlongitud( Línea )
Ejercicio 7
Funciones
● Retomar el ejercicio 3 y resolverlo
definiendo una función complementaria
(...), que regresa el nucleótido
complementar lo pasado como
tema
● Probar a invocar la función así definida
desde la consola interactiva
Solución 7
Funciones
defcomplementare(nucleótido):
nucleotide = [Link]()
si el nucleótido == 'A':
retornar'T'
elifnucleótido =='C':
return'G'
elifnucleótido =='G':
devuelve 'C'
elifnucleótido =='T':
return 'A'
nucleotide = raw_input('Inserisci un nucleotide (A,C,G,T): ')
imprimircomplemento(nucleótido)
complementar('A')
'T'
Ejercicio 8
Funciones
● Agregar al programa anterior una
funcionfilamento_opuesto(...)que utilizas
la función complementaria(...) para
retornar el filamento opuesto al que
pasado como argumento
filamento_opuesto('CTAATGT')
GATTACA
Solución 8
Funciones
deffilamento_opposto(filamento):
opposto =''
fornucleotideinfilamento:
opuesto += complementario(nucleótido)
returnopposto
Ejercicio 9
Iteración
● Escribir un programa que lea unenteronda tastiera
e imprime en pantalla:
1
12
123
1234
...
Y así sucesivamente hasta.
● Para imprimir sin ir a la siguiente línea, añade una
virgola al final de la línea con la instrucción print:
print'foo',
● Para ir a una nueva línea, dar la instrucción print sin
argomenti:
imprimir
Solución 9
Iteración
n = int(raw_input('Ingrese un número n: '))
foriinrange(1,n+1):# el último índice está excluido!
forjinrange(1,i+1):# ¡el último índice está excluido!
printj
imprimir
Ejercicio 10
Iteración
● Escribir un programa que, dados los dos listados de
números subyacentes, crea la matriz de sus productos:
v1: 1,2,3,4,5
v2: 6,7,8,9,10
mat:
1*6 1*7 1*8 ...
2*6 2*7 2*8 ...
...
● Completa el programa con una impresión de la
matriceriga por fila:
[6, 7, 8 ...]
[12, 14, 16 ...]
...
Solución 10
Iteración
v1 = (1,2,3,4,5)
v2 = (6,7,8,9,10)
mat = []
fori, x1inenumerate(v1):
[Link]([])
forx2inv2:
mat[i].append(x1*x2)
forrowinmat
imprimirfila
Una posible alternativa:
mat = [[x1 * x2 para x2 en v2] para x1 en v1]
Ejercicio 11
Funciones
● Escribir un programa que defina una función
stampa_matrice(mat), mejora la impresión
del ejercicio anterior:
>>>imprimir_matriz(mat)
6 7 8 9 10
12 14 16 18 20
18 21 24 27 30
...
● Para que los números se impriman alineados,
usaré por cada número:
print '%3i' % num
Solución 11
Funciones
defstampa_matrice(mat):
forrowinmat:
fornuminrow:
print '%3i' % num,
imprimir
Ejercicio 12
Funciones
● Agregar a el programa anterior una función
cuadrado(val,n), que devuelve una matriz cuadrada de
dimensiones con el valor en cada celda
● Utilizar la función imprimir_matriz(mat) para
imprimir en la consola interactiva una matriz 6x6 con
el valor0en cada celda
Solución 12
Funciones
>>>imprimir_matriz(cuadrado(0,6))
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
Solución 12
Funciones
defcuadrado(val, n):
mat = []
foriinrange(0,n):
fila = []
forjinrange(0,n):
[Link](val)
[Link](fila)
retornarmat
Posibles alternativas:
defcuadrado(val, n):
return[[valforjinrange(0,n)]foriinrange(0,n)]
defcuadrado(val, n):
return[[val] * n] * n
Ejercicio 13
● Utilizar la comprensión de listas para crear la lista de
primi dieci cubi
[0,1,8,27...]
● Aplicar filtro() a la lista para obtener una nueva lista
con solo números pares.
● Aplicar map() a la lista para obtener una nueva lista
que contenga los elementos de la anterior
multiplícate por 3.
Soluzione 13
>>>l1 = [x**3 for x in range(10)]
>>>l1
[0,1,8,27,64,125,216,343,512,729]
>>>l2 = filtrar(lambda x: not x % 2, l1)
>>>l2
[0, 8, 64, 216, 512]
>>>map(lambdax: x*3, l2)
[0, 24, 192, 648, 1536]
Ejercicio 14
● Escribir una función que, recibiendo como entrada el nombre
di un filefasta, restituisca una stringa con la sequenza en
esso contenuta.
>gi|251831106|ref|NC_012920.1| Homo sapiens mitocondria, completo
genoma
GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGG
GTATGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTC
CTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTA
...
Solución 14
defget_seq(archivo_fasta):
f = open(fastafile)
líneas = [Link]()
[Link]()
líneas = [[Link]() para fila en líneas ]
lines = [[Link]('\n','') for row in lines if not [Link]('>')]
return ''.join(lines)
imprimir obtener_seq('[Link]')
¡Solución de una sola línea!
def obtener_seq(fastafile):
return ''.join([Link]().replace(' ','') for row in
open(fastafile)if [Link]('>'))
¡Una solución tan compacta no es necesariamente mejor!
Potrebbe anzi risultare meno leggibile.
Ejercicio 15
● Definir una función eratóstenes(n) que retorne todos los
números primos de 2 a 2 incluidos, utilizando el procedimiento
del Crivello de Eratóstenes
○ Si crea un elenco de todos los números naturales de 2 a n,
dettosetaccio.
○ Se añade el primer número del tamiz a la lista de
números primos encontrados, se eliminan del tamiz todos los
sus múltiplos. Se continúa de esta manera hasta
esaurir los números en el tamiz.
Solución 15
deferatostene(n):
setaccio = range(2, n+1)
primi = []
mientras haya números en el tamiz
[Link](setaccio[0])
setaccio = filtro(lambdax: x%primi[-1], setaccio)
returnprimi
Ejercicio 16
● Crear una cadena repitiendo 10,000 veces la cadena
CGAT
● Crear una cadena de 40,000 caracteres elegidos al azar
dell'alfabeto 'CGAT'.
● Utilizar la función compress() del módulo zlib para
comprime las dos cadenas.
● Calcular las longitudes de las nuevas cadenas obtenidas
ed i relativirapporti di compressione.
Solución 16
>>>s1 ='CGAT'*10000
>>>importaraleatorio
>>>s2 =''.join([[Link]('CGAT')foriinxrange
(10000)])
>>>importzlib
>>>zs1 = [Link](s1)
>>>zs2 = [Link](s2)
>>>len(zs1)
68
>>>len(zs2)
12055
>>>len(zs1)/float(len(s1))
0.0017
>>>len(zs2)/float(len(s2))
0.301375
Ejercicio 17
● Cargar en una cadena una secuencia contenida en un archivo
fasta, como se hizo en el ejercicio 14.
● Calcular la relación de compresión de la secuencia.
Solución 17
>>>seq = obtener_seq('[Link]')
>>>importzlib
>>>zseq = [Link](seq)
>>>len(seq)
16569
>>>len(zseq)
4992
>>>len(zseq)/float(len(seq))
0.3012855332246967
Ejercicio 18
● Escribir un programa que defina la función dh(s,
t), que implementa el cálculo de la distancia de
Hammingtra dos cadenas.
● Agregar la función dhplus(s,t), que generaliza dh
(s,t) al caso distringe de diferente longitud.
Solución 18
defdh(s, t):
iflen(s) != len(t):
devolver-1
return suma(es != etfores, etinzip(s, t))
defdhplus(s, t):
sprime = s + '.' * (len(t) - 1)
tprime = '.'*(len(s)-1)+t
dist = max(len(s), len(t))
forxinxrange(len(s)+len(t)-1):
sprime = sprime[-1]+sprime[:-1]
pardist = dh(sprime, tprime)
dist = min(dist, pardist)
returndist
Ejercicio 19
Funzioni
● Agregar al programa del ejercicio 12 una
funzionespirale(n), que retorna una matriz en espiral
oraria:
>>>imprimir_matriz(espiral(4))
0 1 2 3
11 12 13 4
10 15 14 5
9 8 7 6
● La matriz reporta los números de 0 a n**2 excluido
siguiendo un patrón en espiral en sentido horario.
● Se recomienda usar la función square(val,n)
apenas definida para preparar unamarice a valores no
validi (ad esempio-1), en la cual insertar los números.
Solución 19
Funciones
defspirale(n):
mat = cuadrado(-1, n)
x,y =0,0# celda inicial
dx,dy =1,0# incrementos iniciales
fornuminrange(0,n**2):
mat[y][x] = num # escribe el número en la celda
evita de salir de la matriz o de escribir en una celda llena
si no(0<= x+dx < n) o no(0<= y+dy < n) o mat[y+dy][x+dx] no es -1:
dx,dy = -dy,dx# rota el vector incremento
# cambia cella
x += dx
y += dy
devolver matriz
Ejercicio
Clases y objetos
● Escribir un programa que defina una clase
Punto2D, que representa un punto del plano.
● Definir unmetododistanza_origine(), que retorne la
distancia del punto al origen.
Solución
Clases y objetos
importar matemáticas
clasePunto2D:
def__init__(self, x, y):
self.x = x
self.y = y
defdistanza_origen(self):
return [Link](self.x**2 + self.y**2)
Para probar la clase:
>>>p = Punto2D(1,1)
>>>p.distancia_origen()
1.4142135623730951
Ejercicio
Classi e oggetti
● Escribir un programa que defina una clase
Matrice, che rappresenti una matrice come visto negli
ejercicios anteriores.
● Definir unmetodostampa(), que imprima la matriz
como en el ejercicio 11.
Solución
Clases y objetos
classMatrice:
def __init__(self, mat):
[Link] = mat
defstampa(self):
[Link]:
fornuminrow:
print '%3i' % num,
imprimir
Para probar la clase:
>>>m = Matriz([[1,2,3],[4,5,6],[7,8,9]])
>>>[Link]()
1 2 3
4 5 6
7 8 9
Ejercicio
● Escribir una función cuenta_caracteres(s) que retorne un
diccionario que contiene el número de ocurrencias para
cada carácter presente en la cadena:
>>>contar_caracteres('aiuola')
{'a':2, 'i':1, 'u':1, 'o':1, 'l':1}
● Facultativo: resolver el ejercicio utilizando las construcciones
para el control de excepciones.
Solución
defcontar_caracteres(s):
conteggio = {}
forcins:
ifcinconteggio:
conteggio[c] +=1
de lo contrario:
conteggio[c] =1
retorno conteo
Utilizando los constructos para el control de excepciones:
defcontar_caracteres(s):
conteggio = {}
forcins:
intentar:
conteggio[c] +=1
exceptKeyError:
conteggio[c] =1
returnconteggio
Ejercicio
● Escribir un programa que imprima todos los números
perfettiinferiori a un numerondato in ingresso.
● Un numero naturale è perfetto se è uguale alla somma
de sus divisores propios y de la unidad.
Por ejemplo 6: los divisores propios de 6 son 2 y 3, y la
La suma de 2, 3 y la unidad da como resultado 6.
● 0 no es un número perfecto.
Solución
defperfetto(n):
si n == 0:
devolverFalso
divisori = []
para en el rango(1,n):
si n % i == 0:
[Link](i)
returnsum(divisori) == n
n = int(input('Inserte un número positivo:'))
para i en rango(0, n):
ifperfetto(i):
imprimir