0% encontró este documento útil (0 votos)
7 vistas48 páginas

Ejercicios de Python en Bioinformática

El documento contiene una serie de ejercicios de programación en Python con sus respectivas soluciones. Los ejercicios abordan varios temas como tipos de datos, iteraciones, funciones y otras estructuras básicas del lenguaje.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas48 páginas

Ejercicios de Python en Bioinformática

El documento contiene una serie de ejercicios de programación en Python con sus respectivas soluciones. Los ejercicios abordan varios temas como tipos de datos, iteraciones, funciones y otras estructuras básicas del lenguaje.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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

También podría gustarte