尝试删除python中的“非括号”字符将不起作用。我正在使用remove方法和一个For循环

时间:2019-10-21 05:41:49

标签: python python-3.x for-loop

我正在做一些编码练习。但是我似乎无法剥离一串非括号字符。

代码如下:

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'字符。我最想知道这是怎么回事。谁能解释?

2 个答案:

答案 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)