将 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); }