1

我希望能够验证括号,以便它们包含并忽略任何类型的字符。只要有效地使用带括号的字符串包围,那么Trueelse `False。

我还是 python 新手,所以我不确定如何为这个特定条件正确创建 if 语句。我正在尝试创建一个 fi 语句,这样当我.pop()为空时,deque()我将能够return False而不是收到错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop from an empty deque

也许还有另一种更好的方法可以解决这个问题。如果是这样,我很高兴看到其他人会如何解决它

例如:

a = 'sdf(sadf(sdf)sdf)sdfsd0sdf)sdf(sdf0)' # false 
b = 'dsf))))(((((dsfsdf' # false
c = '()()()()'  # true
d = '((((asd(asd)asd)()()asd))'   # true

我的代码:

# any letter is ignored
# jsut make sure that the parenthesis are equal

from collections import *

def str_valid(stringy):
    param_stack = deque()
    for n in stringy:
        if n ==')':
            param_stack.pop()
        if n == '(':
            param_stack.append('(')
    if param_stack == []:
        return True
    else:
        return False 

a = 'sdf(sadf(sdf)sdf)sdfsd0sdf)sdf(sdf0)' # false 
b = 'dsf))))(((((dsfsdf' # false
c = '()()()()'  # true
d = '((((asd(asd)asd)()()asd))'   # true

print str_valid(a)

print str_valid(b)

print str_valid(c)

print str_valid(d)
4

6 回答 6

6

如果你只是想要一个 if 语句来检查在 pop() 之前双端队列是否为空,你可以使用

if n ==')':
    if param_stack:
        param_stack.pop()
    else:
        return false
...

如果 param_stack 将隐式将其转换为布尔值,如果它包含一些元素则返回 true,否则返回 false。

于 2013-10-17T04:42:08.313 回答
2

需要注意的几点:首先,deque您使用的唯一方法是append()and pop。所以使用普通的 Python 列表更自然。除非您需要在“左端”放置或取下东西,否则双端队列并不比列表更有效。

其次,您已经知道如何测试空双端队列了!你在这里做到了:

if param_stack == []:

现在这有点奇怪,因为您正在将一个双端队列与一个列表进行比较,但它确实有效。有了更多的经验,你会写成:

if len(param_stack) == 0:

并且还有更多经验,您可以使用:

if not param_stack:

(一个空容器在真值上下文中通常表现得像 False)。

但是无论您如何编写它,而不是引入try/except块,执行以下操作会更容易和更清晰:

    if n ==')':
        if param_stack:  # i.e., if it's not empty
            param_stack.pop()
        else:   # it's empty
            return False

清除?

于 2013-10-17T04:44:53.140 回答
1

正如其他人已经提到的那样,您实际上并不需要队列,一个简单的计数器就足够了:

def str_valid(txt):
  ctr = 0
  for n in txt:
    if n == '(':
      ctr = ctr + 1
    if n == ')':
      ctr = ctr - 1      
    if ctr < 0:
      return False
  return ctr == 0

或更短:

def str_valid(txt):
  ctr = 0
  for n in txt:
    ctr = ctr + (n == '(') - (n == ')')
    if ctr < 0:
      return False
  return ctr == 0

或者一个“hacky”单线:)

def str_valid(txt):
  return not reduce(lambda t, c: t if t < 0 else t + (c == '(') - (c == ')'), txt, 0)
于 2013-10-17T05:01:27.917 回答
1

如果您只想 pop() 一个没有问题的空双端队列:

from collections import deque

d = deque()
try:
    d.pop()
except IndexError:
    pass  # do whatever you want in the case that there is nothing there
    return False # is this what you want?
else:
    pass  # do whatever you want in the case that there is something there

只是一个警告,以防你不知道:保持 try/except/else/finally 中的代码量尽可能短且集中。很容易在错误处理程序中弹出错误并导致意外。

如果这不是您需要的,请澄清您的代码中的哪些内容不起作用。

于 2013-10-17T04:27:55.367 回答
1

只需捕获错误并返回False

for n in stringy:
    if n ==')':
        try:
            param_stack.pop()
        except IndexError:
            return False
于 2013-10-17T04:28:16.347 回答
1

使用try,except捕获IndexError异常然后返回False

try:
    param_stack.pop()
except IndexError:
# catch your IndexError exception and do what you want
    return False
于 2013-10-17T04:29:07.220 回答