这个程序应该找出字符串从哪里开始(在"ATG"),直到一个端点(在"TAG“、"TAA”或"TGA")。每当我尝试使用我创建的函数和提供的测试字符串来计算lastIndex时,我就不断地收到-1作为索引。是否有抛出或忽略负值的Python函数?
genome = 'TTATGTTTTAAGGATGGGGCGTTAGTT'
newGenome = ''
def firstIndex(genome):
return genome.find("ATG")
def lastIndex(genome):
return min(genome.find("TAG"), genome.find("TAA"), genome.find("TGA"))
for i in range(genome.count("ATG")):
newgenome = genome[firstIndex(genome):lastIndex(genome)]发布于 2014-03-03 18:22:04
find返回-1,如果它找不到任何东西。因此,如果没有找到任何密码子,lastIndex函数将始终返回-1。
您并不是真的想“忽略-1",而是希望找到TAG|TAA|TGA的第一个实例。(幸运的是,您提供了代码,因此我们避开了XY problem中最糟糕的部分)
您的代码也存在效率低下的问题--它必须使3条完整的字符串贯穿整个字符串,才能找到三个密码子中的第一个。我们可以通过使用regex来改进这一点。
尝试使用re.finditer,这样你只需通过你的基因组一次:
next(m.start() for m in re.finditer('TAG|TAA|TGA',genome))
Out[9]: 8使用next很好,因为如果生成器表达式中没有任何结果,我们就可以提供一个默认值:
def lastIndex(genome):
return next((m.start() for m in re.finditer('TAG|TAA|TGA',genome)),None)发布于 2014-03-03 18:18:32
不确定忽略负值的函数在这里是否足够,因为您必须相应地更改for循环。实现此结果的一种方法是将代码修改为:
def lastIndex(genome):
val = min(genome.find("TAG"), genome.find("TAA"), genome.find("TGA"))
return val if val > -1 else None
for i in range(genome.count("ATG")):
li = lastIndex(genome)
if li:
newgenome = genome[firstIndex(genome):li]
else:
newgenome = genome[firstIndex(genome):]编辑:我的回答是提供一种方法来忽略lastIndex方法中的负返回值,并在后续的for循环中相应地处理它,而不管返回值的实际计算方式如何。但是,正如@roippi所指出的,计算lastIndex的返回值的方法存在一个缺陷,他的回答解决了这个问题。
https://stackoverflow.com/questions/22154138
复制相似问题