我正在尝试使用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']。我已经玩了一段时间,但是我觉得我需要一些指导。
这不是我想的那样容易吗?
答案 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)]