试图删除“;非括号“;python中的字符赢得';不行。I';m使用remove方法和For循环
我正在做一个小的编码练习。但我似乎不能去掉一个字符串中的非括号字符 代码如下:试图删除“;非括号“;python中的字符赢得';不行。I';m使用remove方法和For循环,python,python-3.x,for-loop,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) 我在‘嗨(嗨)()中通过 但它打印的是 ['h', 'i', '
def valid_parentheses(string):
lis = list(string)
print(lis)
stack = []
for i in lis:
if i != '(' and i != ')':
lis.remove(i)
print(lis)
我在‘嗨(嗨)()中通过
但它打印的是
['h', 'i', '(', 'h', 'i', ')', '(', ')']
['i', '(', 'i', ')', '(', ')']
这很奇怪,因为它删除了“h”字符,但没有删除“i”字符。我主要想知道这里发生了什么。有人能解释一下吗?修改您正在迭代的列表就像锯断您所坐的树枝一样。Python通过索引迭代列表。在索引0上,删除第0个元素(
“h”
)。现在,“i”
是第0个元素,但是Python不会有另一个索引为0的迭代,它会在下一个迭代中转到索引1,并且永远不会查看“i”
具体来说,最好的方法是使用re.sub
:
re.sub(r'[^()]', '', 'hi(hi)()')
如果您想要一个更通用的解决方案,那么过滤元素最好使用filter
函数来完成,或者使用条件理解来等效和更通俗地完成:
''.join(c for c in 'hi(hi)()' if c == '(' or c == ')')
如果必须使用循环并删除元素,则以相反的方式循环。这就像坐在锯子的另一边,不掉下来的那一边。删除元素时,不会更改要迭代的任何元素的索引
编辑:正如您在评论中所意识到的,只构建一个新的数据结构要容易得多,这完全避免了修改您正在迭代的结构的问题。这实际上是上面的正则表达式和理解解决方案都在做的事情。这个问题是,您需要修改正在迭代的列表 这应该起作用:
def valid_parentheses(string):
for i in string:
if i != '(' and i != ')':
string = string.replace(i,'')
print(string)
可以对不起,我的问题是noob。因此,我应该在新列表中添加括号。谢谢