2015-05-17 2 views
2

я пытаюсь найти способ, чтобы рассчитывать питон определенного подмножества строки, которая отличается от обычного str.count("X")граф конкретных групп букв в питоне, не исключая их

Вот мой общий пример. Моя переменная dna="AAAAA" Моя цель - распознать каждый набор «AA», который существует в строке. Когда я запускаю dna.count("AA") Я получаю предсказуемый результат 2 при печати.

Однако результат, который я ищу, представляет собой результат 4. Вот изображение, чтобы визуально показать то, что я говорю. (Я бы добавил изображение, но у меня нет 10 репутации, поэтому я должен отправить ссылку) https://docs.google.com/drawings/d/16IGo3hIstcNEqVid8BI6uj09KX4MWWAzSuQcu8AjSu0/edit?usp=sharing

Мне не удалось найти удовлетворительное решение этой проблемы в другом месте. Наверное, потому что я не уверен, что назвать моей проблемой. EDIT: Мне сообщили, что это подсчет перекрывающихся подстрок.

Вопрос становится более сложным, так как полная программа не будет иметь ни одной повторяющейся буквы в строке, а четыре буквы (ATCG), повторяющиеся случайным образом для неопределенных длин. Вот пример: dna="AtcGTgaTgctagcg" Мне нужен скрипт, чтобы выложить сколько пар AT, TC, CG, TG и т. Д. Существует. Двигая одну букву пошагово вправо.

спасибо.

+4

Это может помочь: http://stackoverflow.com/questions/11430863/how-to-find-overlapping-matches-with-a-regexp – Azee

ответ

0

Самый простой алгоритм, использующий ломтиков:

checks = ['AA'] 
string = 'AAAAA' 
before = string[0:1] 
for letter in string[1:]: 
    if before + letter in checks: 
    print "found = " + checks[checks.index(before+letter)] 
    before = letter 

выход:

found AA 
found AA 
found AA 
found AA 
0

Ответ связан с выше в комментариях (How to find overlapping matches with a regexp?), вероятно, наиболее эффективный способ сделать это.

В этой ситуации, на мой взгляд, нет ничего плохого в выражении генератора и collections.Counter.

seq_length = 2 
string = "atctatcta" 
counts = collections.Counter(a[i:i + seq_length] for i in range(len(string) - seq_length) 

print counts # Counter({'ct': 2, 'at': 2, 'tc': 2, 'ta': 1}) 
print counts["ct"] # 2 
print counts["ta"] # 1 

collections.Counter принимает итератора (например, в выражении генератора) и возвращает частоту каждого из элементов в последовательности, как dict -как отображения. Здесь выражение генератора использует небольшую логику индексации, чтобы генерировать каждую из подстрок seq_length лениво.

1

Для простого случая, пары:

dna = 'AtcGTgaTgctagcg'.upper() 
from collections import Counter 
for (a, b), ctr in Counter(zip(dna, dna[1:])).items(): 
    print(a + b, ctr) 

Печати:

CT 1 
TC 1 
TA 1 
GA 1 
AG 1 
CG 2 
GC 2 
GT 1 
AT 2 
TG 2 

Для более общего случая произвольной выбранной длины:

dna = 'AtcGTgaTgctagcg'.upper() 
length = 2 

from collections import Counter 
counts = Counter(dna[i:i+length] for i in range(len(dna) - length + 1)) 

for string, count in counts.items(): 
    print(string, count) 

и тот, который подсчитывает каждый подстроки, так как вы сказали «неопределенные длины»:

dna = 'AtcGTgaTgctagcg'.upper() 

from collections import Counter 
counts = Counter(dna[i:j+1] for j in range(len(dna)) for i in range(j+1)) 

for string, count in counts.items(): 
    print(string, count) 
0
from collections import Counter 

dnaseq = 'AtcGTgaTgctagcg' 
dnaseq_upper = dnaseq.upper() 
it1 = iter(dnaseq_upper) 
it2 = iter(dnaseq_upper) 
next(it2) 
adjacent_pairs_iterator = (''.join(pair) for pair in zip(it1, it2)) 
cntr = Counter(adjacent_pairs_iterator) 
output_generator = ('{}: {}'.format(ss, cnt) for ss, cnt in cntr.items()) 
print(*output_generator, sep='\n') 

Это решение с низким уровнем памяти с помощью итераторы. Узким местом памяти будет ваш объект Counter, которого трудно избежать.

Это выходы:

GT: 1 
TA: 1 
TC: 1 
CT: 1 
GA: 1 
TG: 2 
CG: 2 
AG: 1 
AT: 2 
GC: 2 

Это написано для работы в Python 3.x, кстати, так что если вы в Python 2.x, вы должны быть осторожны. zip необходимо будет изменить на itertools.izip, cntr.items необходимо будет изменить на cntr.iteritems, функция печати не будет работать и, возможно, другие вещи.

Смежные вопросы