在Python中替换核苷酸

时间:2015-09-22 21:35:46

标签: python string bioinformatics

问题是首先反转字符串。然后将“T”换成“A”,反之亦然,将“G”换成“C”,反之亦然。我没有问题扭转字符串。问题是用A替换T,反之亦然,用G和C替换,反之亦然,因为替换方法相互抵消。

这是我的代码:

structs

非常感谢任何帮助或建议。

5 个答案:

答案 0 :(得分:3)

另一种简洁的方式:

trans_table_AT_CG = str.maketrans({
        'T': 'A',
        'A': 'T',
        'C': 'G',
        'G': 'C'
})
def gene_swap_str(s):
    return s[::-1].translate(trans_table_AT_CG)

现在你可以写:

s = input("Enter a string: ").upper()    # Py2: raw_input
print(gene_swap_str(s))

这是Python 3的答案:在Python 2中,str.maketrans不能使用单个dict参数,而只能使用两个等长字符串fromto(仍然在Py3中支持。在Py2中,您使用

trans_table_AT_CG = str.maketrans('ATCG', 
                                  'TAGC')    # Py2 and Py3

相反 - 这也适用于Py3,但我发现两个并行字符串不如dict清晰。当然,在Py2中,使用raw_input而不是input;在任何一种情况下,您都不需要将结果包装在str()中,因为它们都是返回字符串。

答案 1 :(得分:2)

这种情况下您可能会考虑使用某个函数,因为它在以后的代码部分中更具可移植性和可重用性。这是解决您问题的简单方法:

def geneSwap(c):
    return {
        'A': 'T',
        'T': 'A',
        'C': 'G',
        'G': 'C',
    }[c]

s = str(raw_input("Enter a string: ")) 
reversed = s[::-1] 

[geneSwap(c) for c in reversed]

print reversed 

然而,Python的列表处理功能允许更多的压缩编码。这使用geneSwap()函数并在一行中反转序列(闪亮!):

def geneSwap(c):
    return {
        'A': 'T',
        'T': 'A',
        'C': 'G',
        'G': 'C',
    }[c]

s = str(raw_input("Enter a string: ")) 

print ''.join( [geneSwap(c) for c in s[::-1]] )

**感谢@BrianO对打印线的修正。

对于那些不熟悉第二个代码块中print语句中代码的人,可以将列表操作分解为从右到左的步骤:

  1. s是一个字符串,可以视为字符列表。因此,列表操作[::-1]返回一个迭代器,该迭代器在列表中以-1的增量从(但不包括)从开头到开头(或从结尾到开头以相反的顺序)递增
  2. [geneSwap(c) for c in s[::-1]](或者您可以替换任何列表的s[::-1])对列表中的每个元素c执行该函数并将其作为列表返回。
  3. 最后一部分是''.join()。您会注意到第2步会产生一个列表 - 而不是字符串。由于OP想要一个字符串,最后一步是从列表字符组成一个字符串。这是使用join()字符串函数完成的,该函数使用join()使用的字符串连接传递列表的元素。在这种情况下,OP希望将字符串在一起而不将它们分开。所以使用空字符串。如果OP想要空格或破折号( - ),他们将分别使用' '.join()'-'.join()
  4. Call int() function on every list element?启发

答案 2 :(得分:1)

您可以迭代字符串并随时替换字符 顺便说一句,这项检查不起作用:if "T" and "A" and "G" and "C" in reversed。您可以改为使用all()

if all(char in reversed for char in "TAGC"):
    cmap = dict(zip("ATCG", "TAGC"))
    reversed = "".join([cmap[c] for c in reversed])

print(reversed)

答案 3 :(得分:0)

简单地迭代字符将是便宜的时间:

buffer = ""
for c in string:
    if c == "T":
        buffer += "A"
    elif c == "A":
    ... # etc.
# do as you will with buffer

答案 4 :(得分:0)

我认为在Python 3中它更简单。例如:

def nucleo(dna):
    return dna.translate(str.maketrans("ATCG","TAGC"))
print(nucleo("ACTG"))