问题是首先反转字符串。然后将“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
任何帮助或建议将不胜感激。
另一种简洁的方式:
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参数,而只能使用两个等长字符串from
,to
(Py3中仍然支持)。在Py2中,你会使用
trans_table_AT_CG = str.maketrans('ATCG',
'TAGC') # Py2 and Py3
相反 - 这也适用于Py3,但我发现两个平行的字符串不如dict
清晰。当然,在Py2中,使用raw_input
而不是input
;在任何一种情况下,你都不需要将结果包装在str()
中,因为它们都是返回字符串。
在这种情况下,您可能会考虑使用函数,因为它在以后的代码部分中更具可移植性和可重用性。以下是您的问题的简单解决方案:
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语句中的代码的人,可以将列表操作分解为从右到左的步骤:
s
是一个字符串,可以视为字符列表。因此,列表操作[::-1]
返回一个迭代器,该迭代器通过列表递增-1,从(但不包括)从开头到开头(或者从结束到开头以相反的顺序)[geneSwap(c) for c in s[::-1]]
(或者您可以替换任何列表的s[::-1]
)在列表中的每个元素c
上执行该函数并将其作为列表返回。''.join()
。您会注意到第2步会产生一个列表 - 而不是字符串。由于OP想要一个字符串,最后一步是从列表字符组成一个字符串。这是使用join()
字符串函数完成的,该函数使用join()
使用的字符串连接传递列表的元素。在这种情况下,OP希望将字符串在一起而不将它们分开。所以使用空字符串。如果OP想要空格或破折号( - ),他们将分别使用' '.join()
或'-'.join()
。您可以迭代字符串并随时替换字符。
顺便说一句,这项检查不起作用: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)
简单地迭代字符将是便宜的时间:
buffer = ""
for c in string:
if c == "T":
buffer += "A"
elif c == "A":
... # etc.
# do as you will with buffer
我认为它在Python 3中更简单。例如:
def nucleo(dna):
return dna.translate(str.maketrans("ATCG","TAGC"))
print(nucleo("ACTG"))