pop()逻辑中的空deque()

时间:2013-10-17 04:21:27

标签: python python-2.7

我希望能够验证括号,以便它们包含并忽略任何类型的字符。只要有效地使用括号括起来的字符串,然后True否则为'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)

6 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

需要注意的一些事项:首先,您使用的deque的唯一方法是append()pop。所以使用普通的Python列表更自然。 deque并不比列表更有效,除非你需要把东西放在上面,或者把它当作“左端”。

其次,你已经知道如何测试一个空的双端队列!你这样做了:

if param_stack == []:

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

if len(param_stack) == 0:

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

if not param_stack:

(在真实情况下,空容器通常表现得像假)。

但是你写它,而不是引入try/except块,这样做更容易,更清晰:

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

清除?

答案 2 :(得分:1)

如果你只想弹出()一个没有问题的空双端队列:

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中的任何代码量保持为尽可能短且集中。很容易在错误处理程序中弹出错误并导致意外。

如果这不是您所需要的,请说明代码中的内容无效。

答案 3 :(得分:1)

只需捕获错误并返回False

for n in stringy:
    if n ==')':
        try:
            param_stack.pop()
        except IndexError:
            return False

答案 4 :(得分:1)

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

try:
    param_stack.pop()
except IndexError:
# catch your IndexError exception and do what you want
    return False

答案 5 :(得分: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)