用python中的字符串中的索引替换字符列表

时间:2020-07-30 09:11:10

标签: python

我有一个坐标列表:

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的人来说,这绝对不是您想要的!但是,我保留解决方案,因为它不会干扰后面的评论和讨论的流程。

2 个答案:

答案 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合作的人员,所以很棒。