Как я могу извлечь три символа одновременно из строки Python? - PullRequest
0 голосов
/ 16 февраля 2020

Я хочу написать функцию, которая принимает длинную строку символов (последовательность белка типа «UGGUGUUAUUAAUGGUUU») и извлекает из нее три символа за раз (т.е. кодоны). Он может либо возвращать каждый набор из трех символов один за другим, либо список, содержащий все наборы из трех символов. В любом случае будет работать. Но у меня возникли некоторые затруднения с выяснением, как именно это сделать чисто.

Вот что у меня есть до сих пор:

def get_codon_list(codon_string):
    codon_start = 0
    codon_length = 3
    codon_end = 3
    codon_list = []
    for x in range(len(codon_string) // codon_length):
        codon_list.append(codon_string[codon_start:codon_end])
        codon_start += codon_length
        codon_end += codon_length
    return codon_list

Это работает, чтобы вернуть список кодонов, но это кажется очень неэффективным. Мне не нравится использовать жестко запрограммированные числа и такие переменные, если есть лучший способ. Мне также не нравится использовать циклы for, которые фактически не используют переменную в l oop. Это не похоже на правильное использование.

Любые предложения о том, как улучшить это, либо с помощью специфицированной c функции / модуля, либо просто с лучшей техникой Pythoni c?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 16 февраля 2020

Вы можете использовать понимание списка и каждый раз получать фрагмент длиной 3 из строки.

>>> s="UGGUGUUAUUAAUGGUUU"
>>> res = [s[i:i+3] for i in range(0,len(s),3)]
>>> res
['UGG', 'UGU', 'UAU', 'UAA', 'UGG', 'UUU']
2 голосов
/ 16 февраля 2020

Вы можете просто использовать аргумент step функции range, чтобы избежать поддержки переменных:

def get_codon_list(codon_string):
    codon_length = 3
    codon_list = []

    for codon_start in range(0, len(codon_string), codon_length):
        codon_end = codon_start + codon_length
        codon_list.append(codon_string[codon_start:codon_end])

    return codon_list

И тогда он может стать списком:

def get_codon_list(codon_string):
    codon_length = 3

    codon_list = [codon_string[x:x+codon_length] for x in range(0, len(codon_string), codon_length)]

    return codon_list
2 голосов
/ 16 февраля 2020

Рецепт itertools окуня идеально подходит для этого (https://docs.python.org/3/library/itertools.html#itertools - рецепты ):

In [1]: from itertools import zip_longest

In [2]: def grouper(iterable, n, fillvalue=None):
   ...:     "Collect data into fixed-length chunks or blocks"
   ...:     # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
   ...:     args = [iter(iterable)] * n
   ...:     return zip_longest(*args, fillvalue=fillvalue)
   ...:

In [3]: list(grouper('UGGUGUUAUUAAUGGUUU', 3))
Out[3]:
[('U', 'G', 'G'),
 ('U', 'G', 'U'),
 ('U', 'A', 'U'),
 ('U', 'A', 'A'),
 ('U', 'G', 'G'),
 ('U', 'U', 'U')]
0 голосов
/ 16 февраля 2020

С регулярным выражением:

import re

def get_codon_list(codon_string):    
    return list(re.findall(r"(\w{3})", codon_string))
0 голосов
/ 16 февраля 2020

Возможно, вы захотите использовать здесь некоторое время l oop и увеличивать индекс на 3 на каждой итерации, печатать следующие три буквы и выходить, когда индекс будет в пределах 3 от длины

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