Skip to main content
 首页 » 编程设计

python之在 Python 中,我试图快速地用句点替换字符串中的假括号

2025年05月04日23over140

假设我有一个仅包含“(”、“)”和“.”的字符串我想将所有与相应 () 不匹配的 () 替换为 .

例如:

s1 = '((.))' 
s2 = '((.)' 
s3 = '(.))' 

修复这些会得到:

rs1 = '((.))' 
rs2 = '.(.)' 
rs3 = '(.).' 

现在,我正在使用堆栈获取所有伪造的 (),然后使用列表理解来替换它们。

鉴于 fold 是上面的 s* 字符串之一,这是我的代码:

hashFoldStack = [] 
makePeriods = set() 
for hashFoldIndex, hashFoldCharacter in enumerate(fold): 
    if hashFoldCharacter == '(': 
        hashFoldStack.append(hashFoldIndex) 
    elif hashFoldCharacter == ')': 
        if len(hashFoldStack) > 0: 
            hashFoldStack.pop() 
        else: 
            makePeriods.update([hashFoldIndex]) 
if len(hashFoldStack) > 0: 
    for leftover in hashFoldStack: 
        makePeriods.update(leftover) 
 
hashFold = ''.join(['.' if hashIndex in makePeriods\ 
                        else hashCharacter\ 
                        for hashIndex, hashCharacter\ 
                        in enumerate(fold)]) 

问题 1:对于我创建 makePeriods 堆栈的第一部分,是否有更快的方法来执行此操作? 问题 2:列表理解是否会比 lambda 或 re 模块中的某些函数更快?

请您参考如下方法:

我认为代码非常快。让我们现在让它工作:-)

if len(hashFoldStack) > 0: 
    for leftover in hashFoldStack: 
        makePeriods.update(leftover) 

应该只是:

makePeriods.update(hashFoldStack) 

我在网上搜索了一下 here我找到了一篇关于该主题的精彩文章。它提到通过连接和列表推导式构造字符串是最快的方法之一。如果您想进一步优化,请按照评论建议使用某种分析方法。您可以将代码包装在运行多次的 for 循环中,然后像这样启动脚本 $ python -m cProfile script.py。

顺便说一句,可以通过在循环中构造hashFoldList 和hashFoldStack 来使其更快。最后,它只是:hashFold = ''.join(hashFoldList)。无论如何,一个有趣的问题。