是否有抛弃或忽略负值的Python函数?

时间:2014-03-03 18:12:01

标签: python python-3.x

该程序应该找到字符串开始的位置(在“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)]

2 个答案:

答案 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的返回值的方式存在缺陷,他的答案也是如此。