2016-03-03 3 views
6

mehrere Zeichen zu ersetzen, ich bin im Wesentlichen um dieses Problem zu lösen versuchen: http://rosalind.info/problems/revc/Wie in einem String mit Julia

ich alle Vorkommen von A, C, G, T mit ihren Komplimenten T, G, C ersetzt werden soll , A .. mit anderen Worten werden alle A's durch T's ersetzt, alle C's durch G's und usw.

Ich hatte vorher die replace() Funktion verwendet, um alle Vorkommen von 'T' durch 'U' zu ersetzen und hoffte, dass Die replace-Funktion würde eine Liste von Zeichen enthalten, die durch eine andere Liste von Zeichen ersetzt werden, aber ich konnte es nicht funktionieren lassen, so dass es diese Funktionalität möglicherweise nicht hat.

Ich weiß, dass ich dieses Problem lösen könnte leicht das BioJulia Paket verwenden und so mit dem folgenden getan:

# creating complementary strand of DNA 
# reverse the string 
# find the complementary nucleotide 
using Bio.Seq 
s = dna"AAAACCCGGT" 

t = reverse(complement(s)) 

println("$t") 

Aber ich möchte nicht auf das Paket verlassen haben.

Hier ist der Code, den ich bisher habe, wenn mich jemand in die richtige Richtung lenken könnte, wäre das großartig.

# creating complementary strand of DNA 
# reverse the string 
# find the complementary nucleotide 

s = open("nt.txt") # open file containing sequence 

t = reverse(s) # reverse the sequence 

final = replace(t, r'[ACGT]', '[TGCA]') # this is probably incorrect 
# replace characters ACGT with TGCA 

println("$final") 

Antwort

5

Es scheint, dass replace nicht noch Übersetzungen tun ganz wie, sagen wir, tr in Bash. Also statt, hier sind einige Ansätze, statt ein Wörterbuch Mapping (das BioJulia Paket erscheint auch eine ähnliche Verwendung von Wörterbüchern zu machen):

compliments = Dict('A' => 'T', 'C' => 'G', 'G' => 'C', 'T' => 'A') 

Dann, wenn str = "AAAACCCGGT" Sie join wie diese verwenden:

julia> join([compliments[c] for c in str]) 
"TTTTGGGCCA" 

könnte ein weiterer Ansatz, eine Funktion zu verwenden und map:

function translate(c) 
    compliments[c] 
end 

Dann:

julia> map(translate, str) 
"TTTTGGGCCA" 

Strings sind iterierbare Objekte in Julia; Jeder dieser Ansätze liest nacheinander ein Zeichen c und übergibt es an das Wörterbuch, um das Komplementärzeichen zurückzuerhalten. Eine neue Zeichenfolge ist aus diesen komplementären Zeichen aufgebaut.

Die Zeichenfolgen von Julia sind ebenfalls unveränderlich: Sie können Zeichen nicht an Ort und Stelle vertauschen, sondern müssen eine neue Zeichenfolge erstellen.

+0

Dies funktioniert perfekt, wenn ich str = "AAACCCGGT" liefern, aber wenn ich versuche, eine Datei zu öffnen und die Zeichenfolge auf diese Weise zu erhalten, bekomme ich einen 'nicht gefunden in getindex at dict' Fehler. Könnten Sie auch ein wenig darüber nachdenken, wie die Funktion unten Ihr Problem löst? Wie verändert das Indexieren des Wörterbuchs meine Zeichenfolge? Momentan lese ich Mastering Julia, aber ich bin nur ein paar Kapitel drin und habe gestern Julia abgeholt. Obwohl ich ein wenig verstanden habe, bin ich mit einigen der Mechaniken noch nicht vertraut, da es eine ist. – System

+1

Um den Fehler zu beheben, ist es möglich, dass Sie die neuen Zeilen aus der Datei lesen. Diese werden vom Wörterbuch nicht zugeordnet, so dass der Fehler auftritt. Sie könnten 'map (übersetzen, readchomp (s))' versuchen. –

+1

'map (translate, str)' gibt eine neue übersetzte Zeichenkette basierend auf str zurück, ähnlich wird 'replace (str, match, replacement)' auch eine neue Zeichenkette zurückgeben, zB: 'x =" test "; y = ersetzen (x, 'e', ​​'E'); x, y 'gibt' ("test", "tEst") zurück. Sie werden ** nicht ** Ihre ursprüngliche Zeichenfolge an Ort und Stelle aktualisieren! – SalchiPapa