有没有办法使用Python替换序列列表中的前三个字符?

时间:2019-11-01 02:43:18

标签: python python-3.x bioinformatics

我正在尝试使用Python替换将发送出去进行合成的序列列表中的某些字符。所讨论的字符是每个序列的前三个和后三个。我也试图在每个字符之间添加一个*。

棘手的部分是第一个和最后一个字符必须与其他两个字符不同。

例如:DNA序列TGTACGTTGCTCCGAC需要更改为/52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*/i2MOErA/*/32MOErC/

第一个字符必须为/ 52MOEr_ /,最后一个字符必须为/ 32MOEr_ /,其中_是该索引处的字符。对于上面的示例,第一个为T,最后一个为C。另外两个GT和GA需要进行/ i2MOEr_ /修改。

到目前为止,我已经使用.split()函数将序列转换为列表。最终结果是['AAGTCTGGTTAACCAT','AATACTAGGTAACTAC','TGTACGTTGCTCCGTC','TGTAGTTAGCTCCGG']。我已经玩了一段时间,但是我觉得我需要一些指导。

这不是我想的那样容易吗?

2 个答案:

答案 0 :(得分:1)

您可以只使用分治法。这是我实现您目标的解决方案。

/52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*i2MOErA/*/32MOErC/
  

输出:

def dna_transformation(dna):
    """ Takes a DNA string and returns the transformed DNA """

    dnaFirst3Chars = '/52MOEr' + dna[0] + '/*/i2MOEr' + dna[1] + '/*/i2MOEr' + dna[2] + '/*'
    dnaMiddle = '*'.join(dna[3:-3])
    dnaLast3Chars = '*/i2MOEr' + dna[-3] + '/*i2MOEr' + dna[-2] + '/*/32MOEr' + dna[-1] + '/'

    return dnaFirst3Chars + dnaMiddle + dnaLast3Chars

print(dna_transformation("TGTACGTTGCTCCGAC")) # call the function
  

更新:

为简单起见,您可以将上述代码转换为以下函数:

/52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*i2MOErA/*/32MOErC/
  

输出: <form action="home/home">

答案 1 :(得分:0)

假设您的预期结果有错别字,实际上应该是 /52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*/i2MOErA/*/32MOErC/以下代码将起作用:

# python3
def encode_sequence(seq):
    seq_front = seq[:3]
    seq_back = seq[-3:]
    seq_middle = seq[3:-3]
    front_ix = ["/52MOEr{}/", "/i2MOEr{}/", "/i2MOEr{}/"]
    back_ix = ["/i2MOEr{}/", "/i2MOEr{}/", "/32MOEr{}/"]
    encoded = []
    for base, index in zip(seq_front, front_ix):
        encoded.append(index.format(base))
    encoded.extend(seq_middle)
    for base, index in zip(seq_back, back_ix):
        encoded.append(index.format(base))
    return "*".join(encoded)

通读代码,并确保您理解它。本质上,我们只是切片原始字符串,然后将基数插入所需的格式。最终输出的每个元素都会添加到列表中,并在末尾加上*字符。

如果需要动态指定从序列的前面和后面提取的碱基的编号和名称,则可以使用此版本。请注意,{}花括号告诉string.format函数在哪里插入基数。

def encode_sequence_2(seq, front_ix, back_ix):
    seq_front = seq[:len(front_ix)]
    seq_back = seq[-len(back_ix):]
    seq_middle = seq[len(front_ix):-len(back_ix)]
    encoded = []
    for base, index in zip(seq_front, front_ix):
        encoded.append(index.format(base))
    encoded.extend(seq_middle)
    for base, index in zip(seq_back, back_ix):
        encoded.append(index.format(base))
    return "*".join(encoded)

这是输出:

> seq = "TGTACGTTGCTCCGAC"
> encode_sequence(seq)
/52MOErT/*/i2MOErG/*/i2MOErT/*A*C*G*T*T*G*C*T*C*C*/i2MOErG/*/i2MOErA/*/32MOErC/

如果您有要编码的序列列表,则可以遍历该列表并对每个序列进行编码:

encoded_list = []
for seq in dna_list:
    encoded_list.append(encode_sequence(seq))

或具有列表理解:

encoded_list = [encode_sequence(seq) for seq in dna_list)]