我正在做一些编码练习。但是我似乎无法剥离一串非括号字符。
代码如下:
def valid_parentheses(string):
lis = list(string)
print(lis)
stack = []
for i in lis:
if i != '(' and i != ')':
lis.remove(i)
print(lis)
我传入了“ hi(hi)()” 但它输出的是
['h', 'i', '(', 'h', 'i', ')', '(', ')']
['i', '(', 'i', ')', '(', ')']
这很奇怪,因为它删除了'h'字符,但没有删除'i'字符。我最想知道这是怎么回事。谁能解释?
答案 0 :(得分:0)
修改您要迭代的列表就像锯切您所在的分支一样。 Python通过索引迭代列表。在索引0上,删除第0个元素("h"
)。现在"i"
是第0个元素,但是Python不会再进行一次索引为0的迭代,它将在下一次迭代中进入索引1,并且从未查看"i"
。
具体执行此操作的最佳方法是使用re.sub
:
re.sub(r'[^()]', '', 'hi(hi)()')
如果您需要更通用的解决方案,则过滤条件最好使用filter
函数来完成,或者使用条件理解来等效地并且更Python地完成:
''.join(c for c in 'hi(hi)()' if c == '(' or c == ')')
如果必须使用循环并删除元素,请反向循环。这就像坐在锯的另一侧,那侧不会掉下来。删除元素时,不会更改尚未迭代的任何元素的索引。
编辑:正如您在注释中所意识到的那样,构建一个新的数据结构要容易得多,这完全避免了修改正在迭代的结构的问题。这实际上就是上面的正则表达式和理解解决方案都在做的事情。
答案 1 :(得分:0)
此问题是,您正在修改要遍历的列表。
这应该有效:
def valid_parentheses(string):
for i in string:
if i != '(' and i != ')':
string = string.replace(i,'')
print(string)