Всем привет.
Есть следующий код, который отвечают сбалансированы ли данные скобки (аргумент caps) в строке (аргумент source):
# Python 3.x
def is_balanced(source, caps):
source = filter(lambda x: x in caps, source)
caps = dict(zip(caps[::2], caps[1::2]))
stack = []
for cap in source:
if stack and cap == caps.get(stack[-1], ""):
stack.pop()
else:
stack.append(cap)
return not stack
На простом примере
is_balanced("(Sensei says yes!)", "()")
выдает False.
Прогнался по строчкам в дебаггере и обнаружил что проблема в том, что cap в цикле никогда не будет равен ")" o_o.
Если же избавиться от итератора, возвращаемого фильтром:
...
source = list(filter(lambda x: x in caps, source))
...
то все работает прекрасно.
И вопрос: почему так? Что я не понимаю?