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(:将列表元素作为字符串序列连接.| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |