【发布时间】:2021-12-28 15:14:30
【问题描述】:
我正在使用一个函数,我需要匹配的大写字母的开始和结束索引。但要记住的一件事是,如果任何字符串中有任何“-”,我们需要跳过索引进行计数。例如:
str1 = 'ATCGATCGATCG------ATCGATCG'
str2 = 'CGcgCGCGCGCG---CGCCGCGcgCG'
这里其实应该算字符串的长度:
str1:20(而不是 26)
和 str2:23(而不是 26)。
这里的开始和结束索引应该是:
matched_str: 'CG', 'CG', 'CG', 'CG'
start = [6, 10, 14, 18]
end= [7, 11, 18, 22]
现在我得到了以下函数,它在两个字符串中的任何一个中遇到“-”时都不会跳过索引。如何修改以下代码来做到这一点?
str1 = 'ggtacTGAGGTCCCCTGGGTACTGAGATCTCCTCGGTACTGAAGTCTCCTCGGTGCTGAGGTCGCCTCGGTGCTGAGACCTCCTAGGTATTGAGGTCGCCTCGGTACTGAGGTTGCCTC----------------------------GGTGCTGAGGT-----CGCCACGGTGCTGAGACCTCCTAGATACTGAGG----TCTCCTAGGCACGGAGATCTCCTATGTACAGAGACCTCGTCGGTACTGAGGTCGCCTAGGTACTGAGACCTTCTAGGTCCTGAGGT--------CTAGGTACTGAGG-CCTTCTCC\n'
str2 = 'GATGCTGAGGTTCCCAGGATGCTGAGGTTCCCAGGATGCTGAGGTTCCCAGGATGCTGAGGTTCCCAGGATGCTGAGGTTCCCAGGATGCTGAGGTTCCCAGGATGCTGAGGTT-CCTCTCCCGGGATGCTGAGGTTCCTCTCCCGGGATGCTGAGGTTCCTCTCCCAGGATGCTGAGGTTCCCAGGATGCTGAGGTTCCTCTCCCAG---------------------------------GATGCTGAGGTTCCCAGGATGCTGAGGTTCCCAGGATGCTGAGGTTCCTCTCCCAGGATGCTGAGGTTCCTCTCC\n'
matches = []
for i,(letter1, letter2) in enumerate(zip(str1,str2)):#i=index, letter1=str1, letter2=str2
# print(letter1, letter2)
if ((letter1 == letter2) and
letter1 in ['A','T','C','G'] and letter2 in ['A','T','C','G']):
if (not matches or matches[-1][1] != i-1):
matches.append([i,i])
else:
matches[-1][1] += 1
start = [k[0] for k in matches]
end = [k[1] for k in matches]
print(start, end)
【问题讨论】:
-
如果您希望像删除破折号一样完成处理,为什么不直接使用删除破折号的字符串副本?
-
@ScottHunter 抱歉,这不可能!因为我需要比较每个字符串对并且还需要它们的长度。如果我删除了“-”,那么我将无法在确切位置比较每个字符串,并且字符串的长度也不会相同。问题仅在于索引。
-
旁注:您可以将条件缩短为
if letter1 == letter2 and letter1 in ['A','T','C','G']: -
您可以保留
-的数量,然后从i中减去。