首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有抛出或忽略负值的Python函数?

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

Stack Overflow用户
提问于 2014-03-03 18:12:01
回答 2查看 153关注 0票数 1

这个程序应该找出字符串从哪里开始(在"ATG"),直到一个端点(在"TAG“、"TAA”或"TGA")。每当我尝试使用我创建的函数和提供的测试字符串来计算lastIndex时,我就不断地收到-1作为索引。是否有抛出或忽略负值的Python函数?

代码语言:javascript
复制
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)]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-03 18:22:04

find返回-1,如果它找不到任何东西。因此,如果没有找到任何密码子,lastIndex函数将始终返回-1。

您并不是真的想“忽略-1",而是希望找到TAG|TAA|TGA的第一个实例。(幸运的是,您提供了代码,因此我们避开了XY problem中最糟糕的部分)

您的代码也存在效率低下的问题--它必须使3条完整的字符串贯穿整个字符串,才能找到三个密码子中的第一个。我们可以通过使用regex来改进这一点。

尝试使用re.finditer,这样你只需通过你的基因组一次:

代码语言:javascript
复制
next(m.start() for m in re.finditer('TAG|TAA|TGA',genome))
Out[9]: 8

使用next很好,因为如果生成器表达式中没有任何结果,我们就可以提供一个默认值:

代码语言:javascript
复制
def lastIndex(genome):
    return next((m.start() for m in re.finditer('TAG|TAA|TGA',genome)),None)
票数 2
EN

Stack Overflow用户

发布于 2014-03-03 18:18:32

不确定忽略负值的函数在这里是否足够,因为您必须相应地更改for循环。实现此结果的一种方法是将代码修改为:

代码语言:javascript
复制
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的返回值的方法存在一个缺陷,他的回答解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22154138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档