Laboratorio 8
ESERCIZIO XXII
-
Scrivere un programma che definisca una classe MatriceSparsa, che rappresenti una matrice utilizzando un dizionario del tipo
(i,j): value
. -
Definire il metodo
__init__()
in modo che la matrice sia inizializzata come una matrice 1x1 contenente il valore 1. -
Definire un metodo
inserisci(i,j,value)
che inserisce il valorevalue
alla rigai
, colonnaj
della matrice. -
Definire un metodo
stampa()
, che stampi la matrice. N.B.: Per valori mancanti in posizione(i,j)
il metodo stampa 0.
>>> mat = MatriceSparsa()
>>> mat.stampa()
1
>>> mat.inserisci(2,2,5)
>>> mat.stampa()
0 0 0
0 0 0
0 0 9
>>> mat.inserisci(0,2,12)
>>> mat.stampa()
0 0 12
0 0 0
0 0 5
>>> mat.inserisci(0,6,99)
>>> mat.stampa()
0 0 12 0 0 0 99
0 0 0 0 0 0 0
0 0 5 0 0 0 0
Soluzione
class MatriceSparsa(object):
def __init__(self):
self.rows = 1
self.cols = 1
self.values = {(0 ,0): 1}
def inserisci(self, i ,j ,value ):
self.rows = max(self.rows, i+1)
self.cols = max(self.cols, j+1)
self.values[(i,j)] = value
def stampa(self):
for i in xrange(self.rows):
for j in xrange(self.cols):
if (i,j) in self.values : # se la cella (i,j) e’ non nulla
print '%3i' % self.values[(i,j)],
else:
print '%3i' % 0,
print
mat = MatriceSparsa()
mat.stampa()
mat.inserisci(2 ,2 ,9)
mat.stampa()
mat.inserisci(2 ,0 ,45)
mat.stampa()
mat.inserisci(0 ,6 ,99)
mat.stampa()
ESERCIZIO XXIII
- Scrivere una funzione
conta_caratteri(s)
che ritorni un dizionario contenente il numero di occorrenze per ciascun carattere presente nella stringa s:
>>> conta_caratteri('peptide') {'i': 1, 'p': 2, 'e': 2, 't': 1, 'd': 1}
Facoltativo: risolvere l’esercizio utilizzando i costrutti per il controllo delle eccezioni. - Utilizzare la funzione
conta_caratteri
per contare il numero di occorrenze per amminoacidi nella proteina P51787.
Soluzione
# Punto 1
def conta_caratteri(stringa):
if type(stringa) != str:
raise TypeError('Input type must be string')
char_dict = {}
for char in stringa:
try:
char_dict[char] += 1
except KeyError:
char_dict[char] = 1
return char_dict
# Punto 2
sequenza = ""
with open("files/P51787.fasta") as fopen:
for line in fopen:
if not line.startswith('>'):
sequenza += line.replace('\n','')
dict_ammino = conta_caratteri(sequenza)
print dict_ammino
ESERCIZIO XXIV
Scrivere un programma che usando la libreria Biopython effettua le seguenti operazioni:
- Istanziare due oggetti Seq rappresentanti rispettivamente la sequenza
ACT
e la sua sequenza complementare. - Usare la libreria SeqIO per parsare il file
ls_orchid.gbk
in formatogenbank
. Per ciascuna sequenza si stampino l’ID, la lunghezza della sequenza e il numero delle occorrenze delle sequenze istanziate al punto precedente rispettivamente nella sequenza letta e in quella complementare. - Si filtrino le sequenze lette al punto precedente in modo da selezionare solo quelle con una lunghezza inferiore a 700.
- Si salvino le sequenza filtrate su un nuovo file usando il formato FASTA.
Soluzione
from Bio import SeqIO
from Bio.Seq import Seq
# Punto 1
seq = Seq('ACT')
seq2 = seq.complement()
# Punto 2
ls_orchid = SeqIO.parse('ls_orchid.gbk',format='genbank')
for seq_orch in ls_orchid:
seq_o = seq_orch.seq
seq_c = seq_orch.seq.complement()
print seq_orch.id, len(seq_o)
print '\tACT occ: ',str(seq_o).count(str(seq)), '-', str(seq_c).count(str(seq))
print '\tTGA occ: ',str(seq_o).count(str(seq2)), '-', str(seq_c).count(str(seq2))
# Punto 3
filtered = filter(lambda l: len(l.seq) < 700, SeqIO.parse('ls_orchid.gbk',format='genbank'))
# Punto 4
SeqIO.write(filtered,'ls_orchid.fasta',format='fasta')
ESERCIZIO XXV
Dato un file .html fornito, "baby1993.html"
, contenente i nomi più popolari per i bambini nati nel 1990 negli USA, si scriva una funzione
estrai_nomi()
che prenda in ingresso il nome del file e ne faccia il parsing, restituendo una lista contenente l’anno come primo elemento
seguito dalle stringhe nome-rank in ordine alfabetico ['1990', 'Aaron 34', 'Abbey 482', 'Abbie 685', ... ]
.
Si faccia uso della particolare struttura di questo file html:
...
<h3 align="center">Popularity in 1993</h3>
....
<tr align="right"><td>1</td><td>Michael</td><td>Jessica</td>
<tr align="right"><td>2</td><td>Christopher</td><td>Ashley</td>
<tr align="right"><td>3</td><td>Matthew</td><td>Brittany</td>
Soluzione
import re
def estrai_nomi(filename):
"""
"""
pattern = r"<td>([\d]{1,})</td><td>([\w]{1,})</td><td>([\w]{1,})</td>"
year_pattern = r"""<h3 align="center">Popularity in ([\d]{4})</h3>"""
lista_nomi = []
infile = open(filename)
htmlPage = ''.join(line for line in infile)
matches = re.finditer(pattern,htmlPage)
for match in matches:
lista_nomi.append(match.group(2)+' '+match.group(1))
lista_nomi.append(match.group(3)+' '+match.group(1))
lista_nomi.sort()
match_year = re.search(year_pattern,htmlPage)
year = match_year.group(1)
return [year]+lista_nomi
print estrai_nomi("files/baby1993.html")[0:20]