Попытка удалить символы «без скобок» в Python не будет работать. Я использую метод удаления и цикл For - PullRequest
0 голосов
/ 21 октября 2019

Я работаю над небольшим упражнением по кодированию. Но я не могу удалить строку символов без скобок.

вот код:

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 голосов
/ 21 октября 2019

Эта проблема в том, что вы изменяете список, по которому вы перебираете.

Это должно работать:

def valid_parentheses(string):
for i in string:
    if i != '(' and i != ')':
        string = string.replace(i,'')
print(string)
0 голосов
/ 21 октября 2019

Изменение списка, который вы повторяете, похоже на распиливание ветви, на которой вы сидите. 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 == ')')

Если вам нужно использовать цикл и удалять элементы, то выполните цикл в обратном порядке. Это как сидеть на другой стороне пилы, на стороне, которая не падает. Когда вы удаляете элемент, вы не изменяете индекс какого-либо элемента, который вам еще предстоит перебрать.

РЕДАКТИРОВАТЬ: И, как вы поняли из комментария, гораздо проще просто создать новую структуру данных, что полностью исключает проблему изменения структуры, по которой вы выполняете итерацию. Это именно то, что делают и приведенные выше решения для регулярных выражений и понимания.

...