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 syntaxL'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) 9oppure 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
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 0Possiamo 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 3Come 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