迭代字符串以将第 i 个元素与第 i+1 个元素进行比较 python
Iterate string to compare an i element to i+1 element python
我有一个 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]
如果考虑过使用数组执行此操作,但我认为可能有一种简单的方法可以仅在字符串中执行此操作。谢谢
你可以这样做:
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
使用 itertools 是一种方法:
from itertools import groupby
seq = 'AACGTTCAA'
print(sum(len(list(g))-1 for k,g in groupby(seq)))
这会将序列分成连续字母组,然后将每组的长度 1 计入总数。
编辑:更新了 mozway 的评论。
不需要的 True 的原因是因为 seq.index()
index(),总是 return 您正在搜索的字符的第一次出现。当你有 2 个连续的字符时,它实际上是 return 该字符第一次出现的索引,它们总是匹配的。
这是一个快速解决方案:
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)
为了回答您的问题,seq 中的 for i 语句会生成一系列字符串变量,例如 'A'、'A'、'C' 等。
因此,在第一种情况下,当您尝试比较 i == i+1:
时,您将 1 添加到抛出 TypeError 的字符串变量中。
在你的第二个例子中,你执行 if i == seq[seq.index(i)+1]
给出了一个错误的结果,因为 seq.index(i) 总是 returns 该值的第一次出现。
要在基本层面上做您想做的事,您可以执行以下操作:
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 开始到最后,可以避免超出序列的问题。
我有一个 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]
如果考虑过使用数组执行此操作,但我认为可能有一种简单的方法可以仅在字符串中执行此操作。谢谢
你可以这样做:
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
使用 itertools 是一种方法:
from itertools import groupby
seq = 'AACGTTCAA'
print(sum(len(list(g))-1 for k,g in groupby(seq)))
这会将序列分成连续字母组,然后将每组的长度 1 计入总数。
编辑:更新了 mozway 的评论。
不需要的 True 的原因是因为 seq.index()
index(),总是 return 您正在搜索的字符的第一次出现。当你有 2 个连续的字符时,它实际上是 return 该字符第一次出现的索引,它们总是匹配的。
这是一个快速解决方案:
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)
为了回答您的问题,seq 中的 for i 语句会生成一系列字符串变量,例如 'A'、'A'、'C' 等。
因此,在第一种情况下,当您尝试比较 i == i+1:
时,您将 1 添加到抛出 TypeError 的字符串变量中。
在你的第二个例子中,你执行 if i == seq[seq.index(i)+1]
给出了一个错误的结果,因为 seq.index(i) 总是 returns 该值的第一次出现。
要在基本层面上做您想做的事,您可以执行以下操作:
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 开始到最后,可以避免超出序列的问题。