【发布时间】:2016-02-05 21:19:23
【问题描述】:
假设使用以下 Python 函数从字符串中删除破折号(“空白”),同时保持该字符串上的正确注释。输入变量instring和annotations分别构成一个字符串和一个字典。
def DegapButMaintainAnno(instring, annotations):
degapped_instring = ''
degapped_annotations = {}
gaps_cumulative = 0
for range_name, index_list in annotations.items():
gaps_within_range = 0
for pos, char in enumerate(instring):
if pos in index_list and char == '-':
index_list.remove(pos)
gaps_within_range += 1
if pos in index_list and char != '-':
degapped_instring += char
index_list[index_list.index(pos)] = pos - gaps_within_range
index_list = [i-gaps_cumulative for i in index_list]
degapped_annotations[range_name] = index_list
gaps_cumulative += gaps_within_range
return (degapped_instring, degapped_annotations)
如果输入字典指定的范围没有重叠,则所述函数按预期工作:
>>> instr = "A--AT--T"
>>> annot = {"range1":[0,1,2,3,4], "range2":[5,6,7]}
>>> DegapButMaintainAnno(instr, annot)
Out: ('AATT', {'range1': [0, 1, 2], 'range2': [3]})
但是,一旦一个或多个范围重叠,代码就会失败:
>>> annot = {"range1":[0,1,2,3,4], "range2":[4,5,6,7]}
>>> DegapButMaintainAnno(instr, annot)
Out: ('AATTT', {'range1': [0, 1, 2], 'range2': [2, 3]}) # See additional 'T' in string
有人对如何纠正我的代码重叠范围有什么建议吗?
【问题讨论】:
-
如果您解释了注释的含义,这将有很大帮助...比对算法进行逆向工程要好得多
-
@Pynchia 注解在生物信息学中很常见,指的是字符串的不同部分(或技术上的范围)表示应操作的不可分割子字符串。
-
好的,但是您能解释一下使 range1 的注释从
[0,1,2,3,4]变为[0,1,2]的基本原理吗?数字是多少?字符串中的索引?删除破折号后它们需要如何工作? -
@Pynchia 您只需从子字符串中删除破折号,以便只保留字母(因此,在我的标题中“删除破折号”)。每个列表中的数字指的是每个字符串中的索引位置。
-
@Pynchia 上面的 Python 函数已经经过了一些审查和讨论,如 [stackoverflow.com/questions/34816513/….因此,对算法进行逆向工程可能没有用,而是为其添加功能。