Итерировать строку для сравнения элемента 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» и т. д., поэтому, когда в вашем первом случае вы пытаетесь сравнить вы добавляете 1 к строковой переменной, которая выдает TypeError. Во втором примере, где вы выполняете дает ложный результат, так как 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 и заканчивая последним, вы избегаете проблемы с выходом за пределы последовательности.

Ты можешь это сделать:

      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) 
Другие вопросы по тегам