假设我有一个仅包含“(”、“)”和“.”的字符串我想将所有与相应 () 不匹配的 () 替换为 .
例如:
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)。无论如何,一个有趣的问题。
