Ich werde erklären, wie man Map und Lambda in Python mit der Fastq-Datei verwendet.
Die folgende Testdatei ist eine Datei des Analyseergebnisses des DNA-Sequenzers namens Fastq-Datei, die in der Bioinformatik bekannt ist. Die @ -Zeile ist Header, die nächste Zeile ist die DNA-Basensequenz, die 3. Zeile ist die 4. Zeile mit + dazwischen. Ist der Qualitätsbewertungswert für jedes Zeichen der DNA-Basensequenz in der zweiten Zeile, und der Wert, der durch Addieren von 33 zum Qualitätsbewertungswert erhalten wird, ist die mit ASCII-Zeichen konvertierte Zahl.
test.fastq
@test1
GAGCACACGTCTNNANNCNAGTCANNANNNANNNNNNNNNNANNCNNNNNNTNNNNNNNNANNNNTGTCCATTGCNNNCACATCATTGTTTACTTGCGCNT
+
;<<:?@9<?############################################################################################
Ich möchte den Qualitätsbewertungswert auf den ursprünglichen Wert korrigieren. Also habe ich versucht, in einem Chaos mit Python zu schreiben, aber ich bin auf eine sehr praktische Kombination aus Karte und Lambda gestoßen, also werde ich es aufschreiben. Die Umgebung ist übrigens python2. Hinweis: Unterschiede in der Verwendung von Funktionen höherer Ordnung zwischen Python-Versionen.
Um beispielsweise einen Qualitätsbewertungswert von A in eine Zahl umzuwandeln, verwendet Python eine integrierte Funktion namens ** ord (gegenüber chr) **, um den ASCII-Code in eine Zahl umzuwandeln, und subtrahiert dann 33, um das Original zu erhalten. Wird der Wert von sein.
> python -c 'print ord("A")-33'
32
Verwenden Sie die for-Anweisung, um alle 101 Zeichen in der Qualitätswertzeile der Testdatei zu konvertieren.
convert_asci.py
asci_string = ";<<:?@9<?############################################################################################"
for baseq in asci_string:
score = ord(baseq) - 33
print score,
Kann geschrieben werden als.
convert_asci.py Ausführungsergebnis
26 27 27 25 30 31 24 27 30 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Je größer dieser Wert ist, desto besser ist die Qualität, sodass Sie sehen können, dass die Basis des Qualitätswerts von "#" eine sehr schlechte Qualität ist. Übrigens verwendet dieses ASCI-Codekonvertierungsprogramm eine for-Anweisung, und es ist schwierig, dass der Code vertikal lang wird, wenn das Programm länger wird, und die Ausführungsgeschwindigkeit scheint langsam zu sein. Lassen Sie es uns also mit der Karte ausdrücken.
py:convert_asci.2.py
asci_string = ";<<:?@9<?############################################################################################"
def convert_func(x):
score = ord(x) - 33
return score
res_score = map(convert_func, asci_string)
print res_score
text:convert_asci.2.py Ausführungsergebnis
[26, 27, 27, 25, 30, 31, 24, 27, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
Selbst wenn Sie die for-Anweisung auf diese Weise vermeiden, ist die Anweisung in der Zeile, die die Funktion definiert, lang. Also habe ich gelernt, dass Sie eine anonyme Funktion ** namens ** lambda verwenden können, um einen Prozess zu schreiben, der der Funktion "convert_func" in einer Map entspricht (wussten Sie jemals!). Es wird wie folgt sein.
py:convert_asci.3.py modifiziertes Skript
asci_string = ";<<:?@9<?############################################################################################"
res_score = map(lambda x:ord(x) - 33, asci_string)
print res_score
** Die Zeichenfolge wird intern in ein Zeichen unterteilt und in der for-Anweisung und der Map iteriert. Ich habe die Informationen erhalten. Danke, ich habe es korrigiert. ** **.
py:convert_asci.3.Skript vor py Änderung
asci_string = ";<<:?@9<?############################################################################################"
asci_list = list(asci_string) #Dies war nicht erforderlich (Auflistung).
res_score = map(lambda x:ord(x) - 33, asci_list)
print res_score
Wie ist das? Ich habe es in einer Zeile genannt. Das Ergebnis ist das gleiche, da map eine Liste zurückgibt. Anonyme Funktionen sind Einwegfunktionen, die nur einmal verwendet werden. Es wird als anonyme Funktion bezeichnet, da es nur einmal verwendet wird und nicht benannt werden muss. Das Format zum Erstellen einer anonymen Funktion mithilfe eines Lambda-Ausdrucks lautet wie folgt.
Lambda-Argument(Im Beispiel x):Rückgabewert(Im Beispiel ord(x) - 33)
Im Beispiel ist x ein Argument, das den Wert von asci_list nacheinander von map empfängt, den angegebenen Prozess ausführt und dann den Rückgabewert zurückgibt. Das ist sehr praktisch!
Recommended Posts