0

我有一个 DNA 序列:

seq='AACGTTCAA'

我想计算有多少个字母等于下一个。在这个例子中,我应该得到 3(因为 AA-TT-AA)。

在我的第一次尝试中,我发现这不起作用,因为 i 是一个字符串,而 1 是一个整数。

seq='AACGTTCAA'
count=[]
for i in seq:
    if i == i+1: #neither i+=1
        count.append(True)
    else: count.append(False)
print(sum(count))  

所以我尝试了这个:

seq='AACGTTCAA'
count=[]
for i in seq:
    if i == seq[seq.index(i)+1]:
        count.append(True)
    else: count.append(False)
print(sum(count))  

然后我收到这个我无法理解的输出。其中 3 个 True 应该是 False (1,5,8) 尤其是 8,因为它是字符串的最后一个元素。

6
[True, True, False, False, True, True, False, True, True] 

如果考虑使用数组执行此操作,但我认为可能有一种简单的方法可以仅在字符串中执行此操作。谢谢

4

4 回答 4

2

要回答您的问题,i in seq 的语句会产生一系列字符串变量,例如 'A'、'A'、'C' 等。因此,在第一种情况下,当您尝试比较时,i == i+1:您将在字符串中添加 1抛出 TypeError 的变量。在你的第二个例子中,你执行的地方if i == seq[seq.index(i)+1]给出了一个错误的结果,因为 seq.index(i) 总是返回值的第一次出现。要在基本级别上执行您想要的操作,您可以执行以下操作:

def countPairedLetters(seq):
    count = 0
    for i in range(1, len(seq)):
        # i starts with 1 and ends with len(seq)-1
        if seq[i-1] == seq[i]:
            count += 1
    return count    

注意:从索引 1 开始到最后,可以避免超出序列的问题。

于 2021-12-08T15:55:52.783 回答
1

你可以这样做:

for i in range(0, len(seq)):
   if seq[i] == seq[i+1]: # <- this causes an error
      count.append(True)

尽管您必须检查是否seq[i+1]不会导致错误。

更新

count = 0
for i in range(0, len(seq)-1): # this prevents an error
   if seq[i] == seq[i+1]:
      count += 1
于 2021-12-08T15:37:40.843 回答
1

使用 itertools 是一种方法:

from itertools import groupby
seq = 'AACGTTCAA'
print(sum(len(list(g))-1 for k,g in groupby(seq)))

这会将序列分成连续字母的组,然后将每个组的长度-1 计入总数。

编辑:更新了 mozway 的评论。

于 2021-12-08T15:46:24.920 回答
0

不需要的 True 的原因是因为 seq.index()

index() 将始终返回您正在搜索的字符的第一次出现。当您有 2 个连续字符时,它实际上返回该字符第一次出现的索引,并且它们始终匹配。

这是一个快速的解决方案:

seq='AACGTTCAA'
count=[]
for i in range(0,len(seq)-1):
    print(i)
    if seq[i]==seq[i+1]:
        count.append(True)
    else: count.append(False)
print(count) 
于 2021-12-08T15:50:35.797 回答