Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图删除“;非括号“;python中的字符赢得';不行。I';m使用remove方法和For循环_Python_Python 3.x_For Loop - Fatal编程技术网

试图删除“;非括号“;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。因此,我应该在新列表中添加括号。谢谢