计算连续的字母和连字符并将其编码为运行长度

时间:2015-04-25 18:31:29

标签: python python-2.7 collections counter

如何编码带连字符的fasta格式字符串,以便对所有连续的核苷酸和连字符以及encode them as run length进行分组。

将我的序列视为“ATGC ---- CGCTA ----- G ---”。该字符串的序列为Nucleotide,后跟连字符序列。我试图将所有连续的核苷酸分组为字母M,将连续的连字符分组为字母D,并在其前面加上子序列的大小。

此编码的最终结果应为4M4D5M5D1M3D

以下图示说明进一步解释

ATGC----CGCTA-----G---
 |   |    |    |  |  |
 V   V    V    V  V  V
4M   4D  5M    5D 1M 3D

当我使用Counterlist.count()时,我会"M":10 "D":12

from collections import Counter

seq="ATGC----CGCTA-----G---"

M=0
D=0   

cigar=[]

for char in seq:    
    if char.isalpha():
        M+=1
        cigar.append("M")   
    else:
        D+=1
        cigar.append("D")

print Counter(cigar)

3 个答案:

答案 0 :(得分:11)

此问题适用于itertools.groupby

<强>实施

from itertools import groupby
''.join('{}{}'.format(len(list(g)), 'DM'[k]) 
        for k, g in groupby(seq, key = str.isalpha))

<强>输出     '4M4D5M5D1M3D'

<强>解释

值得注意的是,关键功能在这里至关重要。根据序列是否为字母对序列进行分组。完成后,应该直接计算每个组的大小,并从关键元素中找出组的类型。

代码的一些解释

  • 'DM'[k]:这只是表达"M" if k == True else "D"
  • 的绝佳方式
  • len(list(g)):确定每个组的大小。或者,它可以写成sum(1 for e in g)
  • '{}{}'.format:用于创建连续频率和类型
  • 的串联的字符串格式
  • ''.join(:将列表元素作为字符串序列加入。

答案 1 :(得分:4)

import re
seq='ATGC----CGCTA-----G---'

output = ''
for section in re.split('(-*)', seq):
    if section.isalpha():
        output += str(len(section)) + 'M'
    elif section !='':
        output += str(len(section)) + 'D'
print output

答案 2 :(得分:3)

经典方法:

seq="ATGC----CGCTA-----G---"

def MD(c):
    if c.isalpha():return "M"
    else : return "D"

count=1
string=""
for i in range(len(seq)-1):
    if MD(seq[i])==MD(seq[i+1]): count+=1
    else: 
        string=string+str(count)+MD(seq[i])
        count=1
string=string+str(count)+MD(seq[-1])
print string