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

在Python中,我尝试用句点快速替换字符串中的假括号,python,Python,假设我有一个字符串,只有,“.”,我想用对应的替换所有不匹配的 例如: s1 = '((.))' s2 = '((.)' s3 = '(.))' 解决这些问题将带来: rs1 = '((.))' rs2 = '.(.)' rs3 = '(.).' 现在,我正在使用一个堆栈来获取所有的伪代码,然后使用列表理解来替换它们 鉴于fold是上面的s*字符串之一,下面是我的代码: hashFoldStack = [] makePeriods = set() for hashFoldIndex, has

假设我有一个字符串,只有,“.”,我想用对应的替换所有不匹配的

例如:

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)
我在网上搜索了一下,发现了一篇关于这个话题的好文章。它提到通过连接和列表理解构造字符串是最快的方法之一。如果您想进一步优化,请按照评论中的建议使用一些分析方法。您可以将代码封装在运行多次的for循环中,然后像$python-mcprofile script.py这样启动脚本


顺便说一句,有一种方法可以通过在循环中与hashFoldStack一起构造hashFoldList来提高速度。最后,它将是:hashFold=.joinhashFoldList。无论如何,这是一个有趣的问题。

我认为代码非常快。让我们现在就开始吧:-

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

makePeriods.update(hashFoldStack)
我在网上搜索了一下,发现了一篇关于这个话题的好文章。它提到通过连接和列表理解构造字符串是最快的方法之一。如果您想进一步优化,请按照评论中的建议使用一些分析方法。您可以将代码封装在运行多次的for循环中,然后像$python-mcprofile script.py这样启动脚本


顺便说一句,有一种方法可以通过在循环中与hashFoldStack一起构造hashFoldList来提高速度。最后,它将是:hashFold=.joinhashFoldList。无论如何,这是一个有趣的问题。

它最多只需要处理两个括号的段吗?这里有一个简单的答案:

def pblocks(pblocks):
    whole = []
    for i in pblocks:
        L, R = i.split('.')
        p = '.'
        if len(L) == len(R):
            part = [L, R] 
        elif len(L) < len(R):
            part = [L, ').']
        else:
            part = ['.(', R]
        whole.append(part)
    return ['.'.join(i) for i in whole]

对于更详细的示例,您必须给我一点时间,但我认为您可以继续删除段,直到lenL==lenR,但我不确定您希望如何处理多个剩余的paren。

它最多只需要处理两个括号的段吗?这里有一个简单的答案:

def pblocks(pblocks):
    whole = []
    for i in pblocks:
        L, R = i.split('.')
        p = '.'
        if len(L) == len(R):
            part = [L, R] 
        elif len(L) < len(R):
            part = [L, ').']
        else:
            part = ['.(', R]
        whole.append(part)
    return ['.'.join(i) for i in whole]

对于更详细的示例,您必须给我一点时间,但我认为您可以继续删除段,直到lenL==lenR,但我不确定您希望如何处理多个剩余的paren。

您可能希望在codereview.stackexchange.com上发布工作代码。如果您想要提高速度,那么1使用探查器,2使用timeit来查看哪种替代方法实际上更快。与其问假设性的问题,不如实际衡量这两种选择。我已经看到了许多兰姆达斯与理解并排的例子。他们在那里帮助程序员,而不是机器。可以将lambda看作是递归解决方案的工具,以及迭代方法的理解过程。您可能希望在codereview.stackexchange.com上发布工作代码。如果您想要提高速度,那么1使用探查器,2使用timeit来查看哪种替代方法实际上更快。与其问假设性的问题,不如实际衡量这两种选择。我已经看到了许多兰姆达斯与理解并排的例子。他们在那里帮助程序员,而不是机器。将lambda看作是递归函数解的工具,以及迭代过程方法的理解。