该程序应该找到字符串开始的位置(在“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)]
答案 0 :(得分:2)
find
将返回-1。因此,如果找不到任何密码子,您的lastIndex
函数将始终返回-1。
你真的不想“忽略-1”,你想要找到TAG|TAA|TGA
的第一个实例。 (幸运的是,您提供了代码,因此我们避开了XY problem)
您的代码也会因效率低下而受到影响 - 它必须在整个字符串中进行3次完整传递才能找到三个密码子之一的第一次出现。我们可以通过使用正则表达式来改进它。
尝试使用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)
答案 1 :(得分:1)
不确定忽略负值的函数是否足够,因为您必须相应地更改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
的返回值的方式存在缺陷,他的答案也是如此。