迭代字符串以将i元素与i+1元素python进行比较



我有一个DNA序列:

seq='AACGTTCAA'

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

在我的第一次尝试中,我发现这不起作用,因为我是一个字符串,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] 

如果考虑用数组来做这件事,但我认为可能有一种简单的方法可以用字符串来做。感谢

要回答您的问题,seq中的i语句会产生一系列字符串变量,如"a"、"a"one_answers"C"等。因此,在第一种情况下,当您尝试比较i == i+1:时,您将向引发TypeError的字符串变量添加1。在第二个例子中,执行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开始到最后,可以避免溢出序列的问题。

使用itertools是一种方法:

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

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

编辑:更新了mozway的评论。

您可以这样做:

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

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

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

这里有一个快速的解决方案:

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) 

相关内容

  • 没有找到相关文章

最新更新