问题是首先反转字符串。然后将“T”换成“A”,反之亦然,将“G”换成“C”,反之亦然。我没有问题扭转字符串。问题是用A替换T,反之亦然,用G和C替换,反之亦然,因为替换方法相互抵消。
这是我的代码:
structs
非常感谢任何帮助或建议。
答案 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参数,而只能使用两个等长字符串from
,to
(仍然在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语句中代码的人,可以将列表操作分解为从右到左的步骤:
s
是一个字符串,可以视为字符列表。因此,列表操作[::-1]
返回一个迭代器,该迭代器在列表中以-1的增量从(但不包括)从开头到开头(或从结尾到开头以相反的顺序)递增[geneSwap(c) for c in s[::-1]]
(或者您可以替换任何列表的s[::-1]
)对列表中的每个元素c
执行该函数并将其作为列表返回。''.join()
。您会注意到第2步会产生一个列表 - 而不是字符串。由于OP想要一个字符串,最后一步是从列表字符组成一个字符串。这是使用join()
字符串函数完成的,该函数使用join()
使用的字符串连接传递列表的元素。在这种情况下,OP希望将字符串在一起而不将它们分开。所以使用空字符串。如果OP想要空格或破折号( - ),他们将分别使用' '.join()
或'-'.join()
。答案 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"))