Итерировать строку для сравнения элемента i с элементом i+1 python
У меня есть последовательность ДНК:
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 ответа
Чтобы ответить на ваш вопрос, оператор для i в seq дает ряд строковых переменных, таких как «A», «A», «C» и т. д., поэтому, когда в вашем первом случае вы пытаетесь сравнить
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 и заканчивая последним, вы избегаете проблемы с выходом за пределы последовательности.
Ты можешь это сделать:
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() всегда будет возвращать первое вхождение искомого символа. Когда у вас есть 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)