Попытка найти определенный символ строки в последовательных интервалах 10, используя python - PullRequest
1 голос
/ 02 ноября 2019

У меня есть данные, состоящие из ДНК, которые хранятся в виде последовательности букв «a», «g», «c» и «t». В своих данных я использовал:

count = data.count('t')
print(count)

в Python, чтобы найти, что 't' появляется 1514710 раз.

Я хочу узнать, сколько раз 't' появляется в последовательных окнах из 10 букв, как показано ниже: пример

Из рисунка я могу сказать, что 't'появляется 3 раза в первом интервале из 10 (т.е. в первом наборе из 10 букв' t 'появляется 3 раза из 10), а' t 'появляется 2 раза во втором наборе из 10 букв.

Я хочу показать номер для каждого окна без добавления новой строки после каждого числа в моем скрипте Python.

Так, например, если мои данные выглядят так:

    atgcttgcatgcttgcaaatgcatgcttgcattgcaa

Я очень хочу, чтобы мой вывод Python показывал что-то вроде:

    't' appears twice in the first set of 10 letters, 
    and appears 4 times in the second set of 10 letters,
    and so on....

Вот чтоЯ пытался до сих пор:

    window_size = 10                                                                          
    windows_length = len(data) // window_size                                                
    windows = [data[i:i+windows_length] for i in range(0, len(data),                       windows_length)]        
    result = sum(1 if 't' in (x) else 0 for x in windows)  

, который показывает 11

Но я не уверен, что это правильный путь. Любая помощь будет оценена. Спасибо.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019

Если я вас правильно понял, и вы хотите посчитать, сколько окон содержат 't'. Тогда мой подход состоит в том, чтобы разделить data на windows и посчитать, сколько из них содержит 't'.

window_size = 10                                                                          
windows_length = len(data) // window_size                                                
windows = [data[i:i+windows_length] for i in range(0, len(data), windows_length)]        
result = sum(1 if 't' in (x) else 0 for x in windows)    
0 голосов
/ 02 ноября 2019

Если последовательность днк является строкой, то существует textwrap.wrap, который возвращает список перенесенных строк (хотя могут быть соображения памяти). Таким образом, можно написать:

>>> from textwrap import wrap
>>> dna = 'atgcttgcatgcttgcaaatgcatgcttgcattgcaa'
>>> [chunk.count('t') for chunk in wrap(dna, 10)]
[4, 3, 3, 2]                                         

Для получения номеров чанков можно использовать перечисление:

>>> print(*(f'On row #{i} "t" occured {chunk.count("t")} times' for i, chunk in enumerate(wrap(dna, 10), start=1)), sep='\n')
On row #1 "t" occured 4 times
On row #2 "t" occured 3 times
On row #3 "t" occured 3 times
On row #4 "t" occured 2 times
0 голосов
/ 02 ноября 2019

Вы можете разбить ваши данные на списки «окон» с пониманием списка:

windows: List[List[str]] = [data[i * 10:(i + 1) * 10] 
                            for i in range((len(data) + 10 - 1) // 10 )]

, а затем получить счет для каждого окна таким же образом:

counts: List[int] = [window.count('t') 
                     for window in windows]

Вы надеваетене указывайте, как именно вы хотите напечатать вывод, поэтому я оставлю все остальное для вас, чтобы определить, но попробуйте print(counts), чтобы увидеть, работает ли этот формат для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...