next up previous contents
Next: Liste Up: Strutture dati disponibili in Previous: Strutture dati disponibili in   Indice

Stringhe

Tra i tipi di dati più utilizzati e più utili ci sono le stringhe. Esse permettono di memorizzare sequenze di caratteri, e nel nostro caso sono la struttura più semplice da utilizzare quando si ha a che fare con sequenze biologiche come il DNA o proteine (in realtà potrebbe essere più comodo utilizzare strutture più elaborate, ma questo lo vedremo in seguito).

In Python una stringa può essere dichiarata e inizializzata utilizzando il singolo o il doppio apice una o tre volte, ma non con due volte! Da cui

>>> dna1 = 'gccatgacgtta'
>>> dna2 = "gccatgacgtta"
>>> if dna1 == dna2 :      
...    print "The same"
... 
The same
>>> 
>>> dna4 = """gccatgacgtta"""
>>> dna3 = '''gccatgacgtta'''
>>> if dna1 == dna4 and dna2 == dna4 :
...    print "The same"
... 
The same
>>> 
>>> dna5 = ''gccatgacgtta''
  File "<stdin>", line 1
    dna5 = ''gccatgacgtta''
                        ^
SyntaxError: invalid syntax
L'uso di 3 apici ci permette di evitare il simbolo di a capo, di solito comodo quando si scrive il nostro programma su un file. Per l'interprete
>>> a = 'line\nnextline' # '\n' simbolo a capo
>>> print a
line
nextline
>>> b = '''line
... nextline'''
>>> print b
line
nextline
>>>
Esistono operazioni utili che noi possiamo fare con le stringhe, tra cui la concatenazione di due o più stringhe con il simbolo +, o calcolarne la lunghezza (len)
>>> s = 'my '+"str"+"ing"
>>> s
'my string'
>>> len(s)
9
oppure estrarne dei frammenti. Ricordando che 'my string' è lunga 9 caratteri e parte dalla posizione 0 fino a 8 (len(s)-1), si ha
>>> s[0]
'm' 
>>> s[2]
' '
>>> s[8]
'g'
>>> s[-1] # negative indices
'g'
>>>  s[3:8]
'strin'
>>>
Vediamo quindi che s[i:j] seleziona la sottostringa che va dalla posizione i inclusa a quella j esclusa. Inoltre esiste la possibilità di partire dalla fine della stringa utilizzando indici negativi, in queto caso s[-i] indica la i esima posizione a partire dalla fine. Il miglior modo di ricordare come funzionano le operazioni di slicing delle stringhe è quello di pensare che l'indice punti tra i caratteri, con la soglia sinistra del primo carattere che parta da 0. Così che la stringa s='string' di sei caratteri può essere rappresentata come riportato in Figura [*]

Figura: Memo per gli indici della stringa 'string'
\begin{figure}\small\begin{verbatim}+---+---+---+---+---+---+
\vert s \vert...
...---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1\end{verbatim}\normalsize\end{figure}

A differenza di altri linguaggi Python non permette di modificare le stringhe, per cui se proviamo a riassegnare un frammento di stringa dobbiamo operare con la riassegnazionae dell'intera stringa
>>> s = 'his string'
>>> s[1]='e'   # WRONG!
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> s = 'her ' + s[4:10] # OK
>>> s
'her string'
Possiamo inoltre verificare la presenza o l'assenza di un carattere in una stringa con l'usuale operatore in, come
>>> dna = 'cctacctta'
>>> 'c' in dna
1
>>> 'g' in dna
0
Possiamo poi vedere quali sono i metodi associati alle stringhe utilizzando la funzione dir, e vedere come si usano utilizzando __doc__
>>> dna = 'cctacctta'
>>> dir(dna)
['capitalize', 'center', 'count', 'encode', 'endswith', 'expandtabs', 
'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 
'rfind', 'rindex', 'rjust', 'rstrip', 'split', 'splitlines', 
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper']
>>> print dna.find.__doc__
S.find(sub [,start [,end]]) -> int

Return the lowest index in S where substring sub is found,
such that sub is contained within s[start,end].  Optional
arguments start and end are interpreted as in slice notation.

Return -1 on failure.
Così se vogliamo trovare la posizione della prima occorrenza della sottostringa 'cc' in dna, oppure quella non esistente 'ttt' si ha
>>> dna.find('cc')
0
>>> dna.find('ttt')
-1
>>>
Alcuni altri metodi utili sono
>>> dna = ' \t  accTTcgc \n '
>>> print dna
          accTTcgc 
 
>>> dna=dna.strip() # elimina spazi agli estremi
>>> print dna
accTTcgc
>>> dna.upper() # mette tutto maiuscolo
'ACCTTCGC'
>>> dna.lower() # tutto minuscolo
'accttcgc'
>>> dna.capitalize() # iniziali maiuscole
'Accttcgc'
>>> dna # contenuto di dna
'accTTcgc'
>>> dna.index('TT') # posizione della sottostringa 'TT' in dna
3
Come esempio possimo vedere come estrarre solo i caratteri che appartengono all'alfabeto del DNA da una stringa sporca
>>> s = ' acgT 1 2 svG'
>>> dna_alphabet='acgt'
>>> dna=''
>>> for c in s.lower():
...    if c in dna_alphabet:
...       dna=dna+c
... 
>>> dna   
'acgtg'
Due ulteriori funzioni utili sono replace, che permette di rimpiazzare parte della stringa e count che conta il numero di sottostringhe.
>>> dna='TTGGAAGAGCTTACTTAG'
>>> rna=dna.replace('T','U')
>>> print dna, rna
TTGGAAGAGCTTACTTAG UUGGAAGAGCUUACUUAG
>>> dna.count('G') # number of 'G's
5
>>> gccontent=dna.count('G')+dna.count('C')
>>> atcontent=dna.count('A')+dna.count('T')
>>> gccontent/float(atcontent) # (G+C)/(A+T)
0.63636363636363635


next up previous contents
Next: Liste Up: Strutture dati disponibili in Previous: Strutture dati disponibili in   Indice
2004-11-02