我有一个非常简单的程序来删除字符串中的第一级括号,但它似乎不起作用。我的逻辑似乎存在问题,但我无法发现它。
给定AB(CCDC)((EF)G)H
之类的字符串,我应该返回ABCCDC(EF)GH
。但由于某种原因,我的程序返回ABCCDC((EF))GH
。这是程序:
def removeBrackets(string):
level = 0
list1 = list(string)
poses = []
for i in range(len(list1)):
print level, list1[i]
if level == 0 and list1[i] == '(':
print "skipping!"
level += 1
continue
elif level > 0 and list1[i] == '(':
poses.append(list1[i])
level += 1
elif level == 1 and list1[i] == ')':
print "skipping!"
level -= 1
continue
elif level > 0 and list1[i] == ')':
poses.append(list1[i])
level -= 1
print "adding " + list1[i] + "!"
poses.append(list1[i])
result = ""
for i in poses:
result += i
return result
就打印skipping!
和adding!
而言,它会按预期执行。但它仍然增加了两个括号,它不应该。请帮忙。
答案 0 :(得分:0)
elif level > 0 and list1[i] == '(':
poses.append(list1[i])
level += 1
...
elif level > 0 and list1[i] == ')':
poses.append(list1[i])
level -= 1
...
print "adding " + list1[i] + "!"
poses.append(list1[i])
鉴于最后一个,前两个附加是多余的。它们会导致添加重复的括号集。
为了它的价值,你可以稍微简化你的功能。
list1
不是必需的。您可以使用与使用列表相同的方式处理字符串。
您可以直接使用string
迭代string
,而不是枚举for ch in string
的索引。这摆脱了众多的list1[i]
查找。 (如果您确实想知道每个角色的索引,请尝试for i, ch in enumerate(string)
。
如果您从级别字符检查中拆分字符检查,则会删除一些冗余。如果您看到括号,则无论如何都要修改level
,因此最好只编写level += 1
和level -= 1
一次。
poses
是变量的奇怪名称。 parts
怎么样?
创建字符串结果的最后一个循环可以替换为''.join(parts)
。这是一个看起来很滑稽但很常见的Python习语。
结果:
def removeBrackets(string):
level = 0
parts = []
for ch in string:
print level, ch
if ch == '(':
level += 1
if level == 1:
print "skipping!"
continue
elif ch == ')':
level -= 1
if level == 0:
print "skipping!"
continue
print "adding " + ch + "!"
parts.append(ch)
return ''.join(parts)
答案 1 :(得分:0)
poses.append(list1[i])
当迭代器位于'('或')时,for循环底部的这一行会添加第二个括号。而不是在1级或0级