2015-04-25 11 views
7

Come codificare la stringa di formato fasta con trattino per raggruppare tutti i Nucleotidi e i trattini consecutivi e encode them as run length.Conteggio alfabeti e trattini consecutivi e codifica come lunghezza di esecuzione

Considera la mia sequenza come "ATGC ---- CGCTA ----- G ---". La stringa ha una sequenza di Nucleotide seguita da una sequenza di trattini. Sto cercando di raggruppare tutti i nucleotidi consecutivi come la lettera M e i trattini consecutivi come lettera D e aggiungerlo come prefisso alla dimensione della sequenza secondaria.

Il risultato finale di questa codifica deve essere 4M4D5M5D1M3D.

Il seguente grafico pittorica spiega ulteriormente

ATGC----CGCTA-----G--- 
| | | | | | 
V V V V V V 
4M 4D 5M 5D 1M 3D 

Quando uso Counter o list.count(), ottengo "M":10 "D":12:

from collections import Counter 

seq="ATGC----CGCTA-----G---" 

M=0 
D=0 

cigar=[] 

for char in seq:  
    if char.isalpha(): 
     M+=1 
     cigar.append("M") 
    else: 
     D+=1 
     cigar.append("D") 

print Counter(cigar) 
+0

qual è la tua domanda? –

+0

Domanda: sto cercando di ottenere qualcosa come 4M4D5M5D1M3D – gthm

risposta

11

Questo problema è l'ideale per itertools.groupby

Attuazione

from itertools import groupby 
''.join('{}{}'.format(len(list(g)), 'DM'[k]) 
     for k, g in groupby(seq, key = str.isalpha)) 

uscita '4M4D5M5D1M3D'

Spiegazione

In particolare, la funzione chiave è fondamentale qui. Raggruppa la sequenza in base al fatto che sia un alfabeto o meno. Una volta fatto, dovrebbe essere semplice contare le dimensioni di ogni gruppo e capire il tipo di gruppo dall'elemento chiave.

Alcuni spiegazione del codice

  • 'DM'[k]: Questo è solo un modo elegante di rappresentare "M" if k == True else "D"
  • len(list(g)): determina la dimensione di ciascun gruppo. In alternativa, potrebbe essere scritta come sum(1 for e in g)
  • '{}{}'.format: String formattazione per creare una concatenazione della frequenza consecutivi e del tipo
  • ''.join(: Per unire gli elementi della lista come sequenza stringa.
+3

bellissima soluzione .... meglio della mia soluzione :-) .... grazie –

+0

@JoseRicardoBustosM .: Qual è la tua soluzione o mi manca qualcosa? – Abhijit

+0

quando ho visto la tua soluzione, non postarla;) ..... Ho iniziato a studiare il tuo post –

3

approccio classico:

seq="ATGC----CGCTA-----G---" 

def MD(c): 
    if c.isalpha():return "M" 
    else : return "D" 

count=1 
string="" 
for i in range(len(seq)-1): 
    if MD(seq[i])==MD(seq[i+1]): count+=1 
    else: 
     string=string+str(count)+MD(seq[i]) 
     count=1 
string=string+str(count)+MD(seq[-1]) 
print string 
4
import re 
seq='ATGC----CGCTA-----G---' 

output = '' 
for section in re.split('(-*)', seq): 
    if section.isalpha(): 
     output += str(len(section)) + 'M' 
    elif section !='': 
     output += str(len(section)) + 'D' 
print output