将 DNA 序列拆分为密码子列表 D
Split a DNA sequence into a list of codons with D
DNA 字符串由四个字符的字母组成,A,C,G, and T
给定一个字符串,
ATGTTTAAA
我想将其拆分成组成密码子
ATG TTT AAA
codons = ["ATG","TTT","AAA"]
密码子编码蛋白质,它们是多余的 (http://en.wikipedia.org/wiki/DNA_codon_table)
我在 D 中有一个 DNA 字符串,想将它拆分成一个范围
密码子和后来 translate/map 密码子到氨基酸。
std.algorithm 有一个分隔符功能,需要分隔符和
std.regex 拆分器函数需要正则表达式来拆分字符串。
是否有一种惯用的方法来拆分没有定界符的字符串?
import std.algorithm;
import std.regex;
import std.stdio;
int main()
{
auto seq = "ATGTTTAAA";
auto rex = regex(r"[AGT]{3}");
auto codons = matchAll(seq, rex).map!"a[0]";
writeln(codons);
return 0;
}
您似乎在寻找 chunks
:
import std.range : chunks;
import std.encoding : AsciiString;
import std.algorithm : map;
AsciiString ascii(string literal)
{
return cast(AsciiString) literal;
}
void main()
{
auto input = ascii("ATGTTTAAA");
auto codons = input.chunks(3);
auto aminoacids = codons.map!(
(codon) {
if (codon == ascii("ATG"))
return "M";
// ...
}
);
}
请注意,我在这里使用 http://dlang.org/phobos/std_encoding.html#.AsciiString 而不是纯字符串文字。这是为了避免昂贵的 UTF-8 解码,它是为 string
完成的,并且永远不适用于实际的 DNA 序列。我记得以前对类似的生物信息学代码做出显着的性能差异。
如果您只想要 3 个字符的组,您可以使用 std.range.chunks。
import std.conv : to;
import std.range : chunks;
import std.algorithm : map, equal;
enum seq = "ATGTTTAAA";
auto codons = seq.chunks(3).map!(x => x.to!string);
assert(codons.equal(["ATG", "TTT", "AAA"]));
块的 foreach 类型是 Take!string
,因此您可能需要也可能不需要 map!(x => x.to!string)
,具体取决于您希望如何使用结果。
例如,如果您只想打印它们:
foreach(codon ; "ATGTTTAAA".chunks(3)) { writeln(codon); }
DNA 字符串由四个字符的字母组成,A,C,G, and T
给定一个字符串,
ATGTTTAAA
我想将其拆分成组成密码子
ATG TTT AAA
codons = ["ATG","TTT","AAA"]
密码子编码蛋白质,它们是多余的 (http://en.wikipedia.org/wiki/DNA_codon_table)
我在 D 中有一个 DNA 字符串,想将它拆分成一个范围 密码子和后来 translate/map 密码子到氨基酸。
std.algorithm 有一个分隔符功能,需要分隔符和 std.regex 拆分器函数需要正则表达式来拆分字符串。 是否有一种惯用的方法来拆分没有定界符的字符串?
import std.algorithm;
import std.regex;
import std.stdio;
int main()
{
auto seq = "ATGTTTAAA";
auto rex = regex(r"[AGT]{3}");
auto codons = matchAll(seq, rex).map!"a[0]";
writeln(codons);
return 0;
}
您似乎在寻找 chunks
:
import std.range : chunks;
import std.encoding : AsciiString;
import std.algorithm : map;
AsciiString ascii(string literal)
{
return cast(AsciiString) literal;
}
void main()
{
auto input = ascii("ATGTTTAAA");
auto codons = input.chunks(3);
auto aminoacids = codons.map!(
(codon) {
if (codon == ascii("ATG"))
return "M";
// ...
}
);
}
请注意,我在这里使用 http://dlang.org/phobos/std_encoding.html#.AsciiString 而不是纯字符串文字。这是为了避免昂贵的 UTF-8 解码,它是为 string
完成的,并且永远不适用于实际的 DNA 序列。我记得以前对类似的生物信息学代码做出显着的性能差异。
如果您只想要 3 个字符的组,您可以使用 std.range.chunks。
import std.conv : to;
import std.range : chunks;
import std.algorithm : map, equal;
enum seq = "ATGTTTAAA";
auto codons = seq.chunks(3).map!(x => x.to!string);
assert(codons.equal(["ATG", "TTT", "AAA"]));
块的 foreach 类型是 Take!string
,因此您可能需要也可能不需要 map!(x => x.to!string)
,具体取决于您希望如何使用结果。
例如,如果您只想打印它们:
foreach(codon ; "ATGTTTAAA".chunks(3)) { writeln(codon); }