在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看作是递归函数解的工具,以及迭代过程方法的理解。