我有一个坐标列表:
coordinates = [[1,5], [10,15], [25, 35]]
我有一个字符串如下:
line = 'ATCACGTGTGTGTACACGTACGTGTGNGTNGTTGAGTGKWSGTGAAAAAKCT'
我想用coordinates
替换'N'
中成对表示的间隔作为开始和结束。
我唯一想到的方法是:
for element in coordinates:
length = element[1] - element[0]
line = line.replace(line[element[0]:element[1]], 'N'*length)
所需的输出将是:
line = 'ANNNNGTGTGNNNNNACGTACGTGTNNNNNNNNNNGTGKWSGTGAAAAAKCT'
其中间隔[1,5),[10,15)和[25、35)被N
中的line
替换。
这需要我每次遍历坐标列表并更新我的字符串行。我想知道是否还有另一种方法可以替换字符串中的间隔列表?
注意:此问题中的原始解决方案有问题。在line.replace(line[element[0]:element[1]], 'N'*length)
中,replace
将替换序列中与line[element[0]:element[1]]
中的字符串相同的所有其他字符串实例,对于使用DNA的人来说,这绝对不是您想要的!但是,我保留解决方案,因为它不会干扰后面的评论和讨论的流程。
答案 0 :(得分:6)
不要使用字符串连接(由于创建/销毁了字符串实例,这很浪费),请使用列表:
coordinates = [[1,5], [10,15], [25, 35]] # sorted
line = 'ATCACGTGTGTGTACACGTACGTGTGNGTNGTTGAGTGKWSGTGAAAAAKCT'
result = list(line)
# opted for exclusive end pos
for r in [range(start,end) for start,end in coordinates]:
for p in r:
result[p]='N'
res = ''.join(result)
print(res)
获得:
ANNNNGTGTGNNNNNACGTACGTGTNNNNNNNNNNGTGKWSGTGAAAAAKCT
已优化为使用切片和独占end
:
for start,end in coordinates:
result[start:end] = ["N"]*(end-start)
res = ''.join(result)
print(line)
print(res)
为您提供所需的输出:
ATCACGTGTGTGTACACGTACGTGTGNGTNGTTGAGTGKWSGTGAAAAAKCT
ANNNNGTGTGNNNNNACGTACGTGTNNNNNNNNNNGTGKWSGTGAAAAAKCT
答案 1 :(得分:2)
好问题,这应该起作用。
coordinates = [[1,5], [10,15], [25, 35]]
line = 'ATCACGTGTGTGTACACGTACGTGTGNGTNGTTGAGTGKWSGTGAAAAAKCT'
for L,R in coordinates:
line = line[:L] + "N"*(R-L) + line[R:]
print(line)
您可能需要根据定义坐标的方式进行调整,例如。包含1的索引。
我们需要更多的与DNA合作的人员,所以很棒。