编辑:忘记提及工作簿中的原始问题,即: 编写一个接受字符串并检查是否包含匹配括号的函数,即()。如果返回True 可以,否则为False。
我正在尝试制作一个小程序,用于检查字符串是否具有匹配的括号。我的工作簿指出:“考虑使用变量来保存未封闭的括号的数量:+1表示开括号,而-1表示闭括号。使用此方法来检查您在打开一个括号之前没有关闭过一个,并且所有括号都已被关闭。最后关闭”。这应该主要用于循环和字符串方法。
doctest应该证明我的意思:
def match_brackets(s):
"""
>>> match_brackets('(7 - 4) * (3 + 2)')
True
>>> match_brackets('((2 + 5) / (13 +12)')
False
"""
这是我到目前为止尝试过的:
unclosed = 0
opening = "("
closing = ")"
for ch in s:
if ch in opening:
unclosed += 1
return True
elif ch in closing:
unclosed -= 1
return False
return unclosed
但是它每次都返回True。在过去的20分钟里,我一直试图弄清楚这一点,但无法克服。
我感谢所有帮助,并在必要时可以提供更多信息(尽管我认为提供的信息就足够了。)
答案 0 :(得分:3)
您可以使用count
,但由于返回得太早而使代码无法正常工作;如果是return True
,也应该0
,否则应使用{{1} }:
return False
因此,我只需要首先检查def match_brackets(s):
"""
>>> match_brackets('(7 - 4) * (3 + 2)')
True
>>> match_brackets('((2 + 5) / (13 +12)')
False
"""
return s.count('(') == s.count(')') and all([x < y for x, y in zip([i for i, x in enumerate(s) if x == '('], [i for i, x in enumerate(s) if x == ')'])])
的数量和(
的数量(如果它们相等),就可以在)
子句中继续另一条语句,否则返回{{1 }}已经并继续执行,下一条语句正在检查所有and
是否都在False
之前,并使用两个(
的列表理解之间的zip(它们只是获取它们的索引)搜索值)并进行外部列表理解,即简单地检查所有)
是否都在enumerate
之前,然后使用(
来查看它们是否全部为{{1} }。