Zählen aufeinanderfolgende Alphabete und Bindestriche und kodieren sie als Lauflänge

7

Wie kodiere ich meine Bindestrich-Fasta-Formatzeichenfolge, um alle aufeinanderfolgenden Nukleotide und Bindestriche zu gruppieren, und kodiere sie als Lauflänge .

Betrachte meine Sequenz als "ATGC ---- CGCTA ----- G ---". Die Zeichenfolge hat eine Folge von Nukleotid gefolgt von einer Folge von Bindestrichen. Ich versuche, alle aufeinanderfolgenden Nucleotide als Buchstaben M und aufeinanderfolgende Bindestriche als Buchstaben D zu gruppieren und sie mit der Größe der Subsequenz zu versehen.

Das Endergebnis dieser Codierung sollte 4M4D5M5D1M3D sein.

Die folgende Grafik erklärt es weiter

%Vor%

Wenn ich Counter oder list.count() verwende, bekomme ich "M":10 "D":12 :

%Vor%     
gthm 25.04.2015, 18:31
quelle

3 Antworten

11

Dieses Problem ist ideal für itertools.groupby

Implementierung

%Vor%

Ausgabe     '4M4D5M5D1M3D'

Erläuterung

Bemerkenswert ist hier die Schlüsselfunktion. Gruppiere die Sequenz basierend darauf, ob sie ein Alphabet ist oder nicht. Sobald dies erledigt ist, sollte es einfach sein, die Größe jeder Gruppe zu zählen und den Typ der Gruppe aus dem Schlüsselelement herauszufinden.

Eine Erläuterung des Codes

  • 'DM'[k] : Dies ist nur eine nette Möglichkeit, "M" if k == True else "D" darzustellen
  • len(list(g)) : Bestimmt die Größe jeder Gruppe. Alternativ könnte es als sum(1 for e in g) geschrieben worden sein
  • '{}{}'.format : String-Formatierung zum Erstellen einer Verkettung der aufeinanderfolgenden Häufigkeit und des Typs
  • ''.join( : Zum Verknüpfen der Listenelemente als String-Sequenz.
Abhijit 25.04.2015, 18:38
quelle
4
%Vor%     
jeff_carter 25.04.2015 19:13
quelle
3

klassischer Ansatz:

%Vor%     
B. M. 25.04.2015 18:57
quelle