Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算连续的字母和连字符,并将其编码为游程长度_Python_Python 2.7_Collections_Counter - Fatal编程技术网

Python 计算连续的字母和连字符,并将其编码为游程长度

Python 计算连续的字母和连字符,并将其编码为游程长度,python,python-2.7,collections,counter,Python,Python 2.7,Collections,Counter,我如何对我的连字符fasta格式字符串进行编码,以将所有连续的核苷酸和连字符以及 将我的序列视为“ATGC---CGCTA---G---”。字符串的顺序为,后跟连字符。我试图将所有连续核苷酸分组为字母M,将连续连字符分组为字母D,并以子序列的大小作为前缀 此编码的最终结果应为4M4D5M5D1M3D 下面的图示进一步说明了这一点 ATGC----CGCTA-----G--- | | | | | | V V V V V V 4M 4D 5M

我如何对我的连字符fasta格式字符串进行编码,以将所有连续的核苷酸和连字符以及

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

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

下面的图示进一步说明了这一点

ATGC----CGCTA-----G---
 |   |    |    |  |  |
 V   V    V    V  V  V
4M   4D  5M    5D 1M 3D
当我使用
计数器
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)

这个问题是理想的解决方案

实施

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

解释

from itertools import groupby
''.join('{}{}'.format(len(list(g)), 'DM'[k]) 
        for k, g in groupby(seq, key = str.isalpha))
值得注意的是,关键功能在这里至关重要。根据序列是否为字母表对序列进行分组。完成后,应该直接计算每个组的大小,并从关键元素中找出组的类型

代码的一些解释

  • 'DM'[k]
    :如果k==True或者“D”
  • len(list(g))
    :确定每个组的大小。或者,它可以写为
    sum(对于e-in-g为1)
  • '{}{}.format
    :用于创建连续频率和类型的串联的字符串格式
  • '.join(
    ):以字符串顺序连接列表元素
经典方法:

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

你的问题是什么?问题是:我正在努力实现4M4D5M5D1M3D@JoseRicardoBustosM.:您的解决方案在哪里?或者我遗漏了什么?非常好且优雅的解决方案!也许可以对问题进行编辑以更好地反映实际问题?我不会这么简洁,如果k是“D”,请使用
“M”
。您阅读代码的频率比编写代码的频率高!