我有括号列表,例如
li1 = ['{','[','(',')',']','}' ] # correctly paired
li2 = ['[','(',')',']'] # correctly paired
li3 = ['{','[','}',']',')','}'] # incorrectly paired
如何使用for循环将第一个元素与最后一个元素进行比较,然后将下一个元素与下一个元素进行比较?
我的解决方案就像
if len(li) %2 == 0:
for i in range(len(li)):
if li[0] == li[-1]: #and if li[1] == li[-2]: and so on.....
return True
else:
return False
else:
return False
但这会为li3
返回错误的结果。
答案 0 :(得分:1)
您的代码中有3个错误:
i
计数器,所以你的循环只测试第一个和最后一个元素'[' == ']'
永远不会成真,但配对是正确的。我不打算使用计数器,使用zip()
和reversed()
来配对开头和结尾的元素;你只需要测试li
的前半部分:
def test_pairs(li, _map={'(': ')', '[': ']', '{': '}'}):
l = len(li)
if l % 2 == 1:
# odd length list, can't be paired
return False
# pair up the first half with the second half, reversed
for first, second in zip(li[:l // 2], reversed(li)):
if _map.get(first) != second:
# Either first is not a left bracket, or right bracket is not a match
return False
# everything tested, so everything matched
return True
演示:
>>> test_pairs(['{', '[', '(', ')', ']', '}'])
True
>>> test_pairs(['[', '(', ')', ']'])
True
>>> test_pairs(['{', '[', '(', ']', ')', '}'])
False
对单个嵌套维度的测试通常不够。大多数真实情况都会包含多个分组,例如['(', '{', '}', '[', ']', ')']
(请注意{
,}
和[
,]
对不是嵌套!)。如果您需要匹配这种情况,您需要使用堆栈:
def test_groupings(li, _map={'(': ')', '[': ']', '{': '}'}):
stack = []
for el in li:
if el in _map:
# opening element, add to stack to look for matching close
stack.append(el)
elif not stack or _map[stack[-1]] != el:
# not an opening element; is the stack is empty?
# or is this element not paired with the stack top?
return False
else:
# closing element matched, remove opening element from stack
stack.pop()
# if the stack is now empty, everything was matched
return not stack
这仍然可以正确检测您的情况*,但也会为我的计数器示例返回True
:
>>> test_groupings(['{', '[', '(', ')', ']', '}'])
True
>>> test_groupings(['[', '(', ')', ']'])
True
>>> test_groupings(['{', '[', '(', ']', ')', '}'])
False
>>> test_groupings(['(', '{', '}', '[', ']', ')'])
True
答案 1 :(得分:-1)
你的错误是:
所以,这是我的解决方案:
def check(li):
length = len(li)
if length % 2 == 0:
pairs = {'}': '{', ']': '[', ')': '('}
stack = []
for i in range(length):
if li[i] in pairs.values():
stack.append(li[i])
elif li[i] in pairs.keys() and stack[-1] == pairs[li[i]]:
stack.pop()
return len(stack) == 0
else:
return False
我使用堆栈来打开括号,如果找到一个右括号,它会弹出堆栈。最后,检查堆栈是否被清除。
使用您的测试用例测试结果
li1 = ['{','[','(',')',']','}' ]
check(li1)
>>> True
li2 = ['[','(',')',']']
check(li2)
>>> True
li3 = ['{','[','(',']',')','}']
check(li3)
>>> False