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

gth*_*thm 7 python collections counter python-2.7

如何编码带连字符的fasta格式字符串以对所有连续的Nucleotide和连字符进行分组,并将它们编码为运行长度.

将我的序列视为"ATGC ---- CGCTA ----- G ---".该字符串具有核苷酸序列,后跟连字符序列.我试图将所有连续的核苷酸分组作为字母M和连续的连字符作为字母,D并以子序列的大小作为前缀.

这个编码的最终结果应该是4M4D5M5D1M3D.

以下图示说明进一步解释了它

ATGC----CGCTA-----G---
 |   |    |    |  |  |
 V   V    V    V  V  V
4M   4D  5M    5D 1M 3D
Run Code Online (Sandbox Code Playgroud)

当我使用Counter或者list.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)
Run Code Online (Sandbox Code Playgroud)

Abh*_*jit 11

这个问题非常适合itertools.groupby

履行

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

输出 '4M4D5M5D1M3D'

说明

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

代码的一些解释

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

  • 优雅的解决方案!也许可以编辑问题以更好地反映实际问题? (2认同)
  • 我不会如此简洁地使用"M",如果k除"D"`.你比你写代码更频繁地阅读代码! (2认同)