代码之家  ›  专栏  ›  技术社区  ›  Runner

计算文件中某个三联体的数量(DNA密码子分析)

  •  2
  • Runner  · 技术社区  · 12 年前

    这个问题实际上是关于DNA密码子分析的,简单地说,假设我有一个这样的文件:
    atgaaaccaaag。。。
    我想计算这个文件中存在的“aaa”三元组的数量。重要的是,三元组从一开始就开始(意思是atg,aaa,cca,aag,…)所以在这个例子中,结果应该是1,而不是2‘aaa’。
    有没有Python或Shellscript方法可以做到这一点?谢谢

    4 回复  |  直到 12 年前
        1
  •  7
  •   Joran Beasley    12 年前

    第一次读入文件

    with open("some.txt") as f:
        file_data = f.read()
    

    然后把它分成3个

    codons = [file_data[i:i+3] for i in range(0,len(file_data),3)]
    

    然后数他们

    print codons.count('aaa')
    

    像这样

    >>> my_codons = 'atgaaaccaaag'
    >>> codons = [my_codons[i:i+3] for i in range(0,len(my_codons),3)]
    >>> codons
    ['atg', 'aaa', 'cca', 'aag']
    >>> codons.count('aaa')
    1
    
        2
  •  2
  •   John Kugelman Michael Hodel    12 年前

    显而易见的解决方案是将字符串拆分为3个字符,然后计算“aaa”的出现次数:

    s = 'atgaaaccaaag'
    >>> [s[i : i + 3] for i in xrange(0, len(s), 3)].count('aaa')
    1
    

    如果字符串真的很长,那么这个解决方案将在创建子字符串列表时不必要地占用一些内存。

    s = 'atgaaaccaaag'
    >>> sum(s[i : i + 3] == 'aaa' for i in xrange(0, len(s), 3))
    1
    >>> s = 'aaatttaaacaaagg'
    >>> sum(s[i : i + 3] == 'aaa' for i in xrange(0, len(s), 3))
    2
    

    这使用了一个生成器表达式,而不是创建一个临时列表,因此它将更节省内存。它利用了这样一个事实 True == 1 ,即。 True + True == 2

        3
  •  1
  •   dckrooney    12 年前

    您可以首先将字符串分成三元组,使用以下方法:

    def split_by_size(input, length):
        return [input[i:i+length] for i in range(0, len(input), length)]
    
    tripleList = split_by_size(input, length)
    

    然后检查“aaa”,并对其进行总结:

    print sum(filter(lambda x: x == "aaa", tripleList))
    
        4
  •  0
  •   Pierre    12 年前

    使用一个简单的shell,假设您的fasta只包含一个序列。

    grep -v ">"  < input.fa |
    tr -d '\n' |
    sed 's/\([ATGCatgcNn]\{3,3\}\)/\1#/g' |
    tr "#" "\n" |
    awk '(length($1)==3)' |
    sort |
    uniq -c