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