在Python中替换核苷酸

问题描述 投票:-1回答:5

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

这是我的代码:

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

if "T" and "A" and "G" and "C" in reversed: 
    reversed.replace("A", "T") 
    reversed.replace("T", "A")
    reversed.replace("C", "G")
    reversed.replace("G", "C") 

print reversed 

任何帮助或建议将不胜感激。

python string bioinformatics
5个回答
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()中,因为它们都是返回字符串。


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()

受到Call int() function on every list element?的启发


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)

0
投票

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

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

0
投票

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

def nucleo(dna):
    return dna.translate(str.maketrans("ATCG","TAGC"))
print(nucleo("ACTG"))
© www.soinside.com 2019 - 2024. All rights reserved.