在Python中将返回的“值”和字符串进行比较
我有一个Python脚本,它会把输入的内容变成一个链表,然后比较里面的字符,以确保所有打开的括号都有正确顺序的闭合括号。
比如说,(9-{5*2(1+1)}) 是对的,返回True;而 (9-{5*2{1+1))) 就不对,返回False。
我遇到的问题是,当我把一个函数的返回值和一个字符串进行比较时,if语句在第152行就停住了。当我中断脚本时,出现了这个错误:
Traceback (most recent call last):
File "lab2.py", line 195, in <module>
bracketCheck(list)
File "lab2.py", line 152, in bracketCheck
if list.getNodeAtPosition(i) == '(' or list.getNodeAtPosition(i) == '{' or list.getNodeAtPosition(i) == '[':
File "lab2.py", line 114, in getNodeAtPosition
currentNode = currentNode.getNext()
KeyboardInterrupt
我的脚本中关于链表的代码,主要是受到DreamInCode的atraub的启发。还有,输入必须一个一个地输入,直到你输入“done”为止:
import sys
stack = []
openbrackets = ['(','{','[']
closebrackets = [')','}',']']
class LinkedList:
class Node:
def __init__ (self, cargo=None):
self.cargo = cargo
self.next = None
def __str__ (self):
return str(self.cargo)
def __len__ (self):
return self.length
def isEmpty (self):
if length == 0:
return True
else:
return False
def getElement(self):
print self.__str__()
def getNext (self):
return self.next
def setElement(self, cargo):
self.cargo = cargo
def setNext(self, cargo):
self.next = cargo
def hasNext(self):
return self.next != None
def __init__(self):
self.first = LinkedList.Node()
self.length = 0
def __len__ (self):
return self.length
def __add__(self, other):
retList = LinkedList()
for item in self:
retList.append(item)
for item in other:
retList.append(item)
return retList
def getFirst(self):
return self.first.getNext()
def currentPoint(self):
current = self.first.getNext()
def setFirst(self, cargo):
toAdd = LinkedList.Node(cargo)
toAdd.setNext(self.first.getNext())
self.first.setNext(toAdd)
self.length += 1
def removeFirst(self):
if self.length > 0:
value = self.first.getNext().getElement()
self.first.setNext(self.first.getNext().getNext())
self.length -= 1
return value
else:
print "Error: List is empty"
def addLast(self, cargo):
current = self.first
while current.hasNext():
current = current.getNext()
current.setNext(LinkedList.Node(cargo))
self.length += 1
def removeLast(self,index=None):
if index ==None:
index = self.length-1
previous = self.getNodeAtPosition(self.checkIndex(index)-1)
toRemove = previous.getNext()
afterNext = None
if toRemove.hasNext():
afterNext = toRemove.getNext()
previous.setNext(afterNext)
self.length-=1
return toRemove.getElement()
def getLast(self):
current = self.first
while current.hasNext():
current = current.getNext()
return current
def moveNext(self):
current = self.first
def getNodeAtPosition(self, index):
currentNode = self.first
for i in range(index+1):
currentNode = currentNode.getNext()
return currentNode
def __str__ (self):
if self.length == 0:
return '[]'
retString = "["
currentElement = self.first.getNext()
for i in range(self.length):
retString += str(currentElement) + ", "
currentElement = currentElement.getNext()
return retString[:-2] + ']'
def checkIndex(self, index):
if type(index) != int:
raise TypeError("Index must be an integer or a slice not a")
if index < 0:
index += self.length
if index >= self.length or index < 0:
raise IndexError("Index out of bounds")
return index
def bracketCheck(list):
checkList = LinkedList()
opencount=0
closecount=0
while(list.first.hasNext):
isEqual = True
i=0
i=i+1
if list.getNodeAtPosition(i) == '(' or list.getNodeAtPosition(i) == '{' or list.getNodeAtPosition(i) == '[':
checkList.addLast(list.first.getNodeAtPosition(i))
opencount = opencount + 1
if list.getNodeAtPosition(i) == ')':
closecount = closecount + 1
if list.first.getLast() == openbrackets[0]:
checkList.removeLast()
else:
isEqual = False
if list.getNodeAtPosition(i) == '}':
closecount = closecount + 1
if list.first.getLast() == openbrackets[1]:
checkList.removeLast()
else:
isEqual = False
if list.getNodeAtPosition(i) == ']':
closecount = closecount + 1
if list.first.getLast() == openbrackets[2]:
checkList.removeLast()
else:
isEqual = False
'''print checkList'''
print opencount
print closecount
if isEqual == False:
print "an extra is missing."
else:
print "win!"
print "Enter list:"
list = LinkedList()
while input != "done":
input = raw_input()
if input == "done":
break
list.addLast(input)
print list
bracketCheck(list)
3 个回答
为什么 while(list.first.hasNext)
会结束呢?
其实有些情况下你会从列表中删除一些项目,有些情况下你则不会修改列表。如果你一直保持列表不变,它就会一直循环下去,永远不会停止。
那 i=0; i=i+1
是什么意思呢?
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个函数时,发现它的表现和预期不一样,这时候就需要仔细检查代码,看看是不是哪里出错了。
另外,编程语言有很多规则和语法,如果不遵守这些规则,代码就可能无法正常运行。就像写作文一样,如果语法错误,老师可能看不懂你的意思。
所以,遇到问题时,首先要冷静下来,仔细阅读错误信息,理解它的意思。然后,逐步检查代码,找出可能的错误。多问问题,多查资料,慢慢就能提高自己的编程水平。
brmap = dict(['()', '[]', '{}'])
closebr = set(brmap.values())
def check_brackets(expr):
stack = []
for c in expr:
if c in brmap:
stack.append(brmap[c])
elif c in closebr and (not stack or stack.pop() != c):
return False
return not stack
你的代码里有太多逻辑错误,我都数不过来了。
下面这个修改过的代码运行得很好(根据我的基本测试),请你对比一下,看看你原来的代码里有什么错误:
def bracketCheck(myList):
checkmyList = LinkedList()
opencount=0
closecount=0
i=0
isEqual = True
while(i < myList.length):
i=i+1
if myList.getNodeAtPosition(i-1).cargo == '(' or myList.getNodeAtPosition(i-1).cargo == '{' or myList.getNodeAtPosition(i-1).cargo == '[':
checkmyList.addLast(myList.getNodeAtPosition(i-1))
opencount = opencount + 1
if myList.getNodeAtPosition(i-1).cargo == ')':
closecount = closecount + 1
if checkmyList.getLast().__str__() == openbrackets[0]:
checkmyList.removeLast()
else:
isEqual = False
if myList.getNodeAtPosition(i-1).cargo == '}':
closecount = closecount + 1
if checkmyList.getLast().__str__() == openbrackets[1]:
checkmyList.removeLast()
else:
isEqual = False
if myList.getNodeAtPosition(i-1).cargo == ']':
closecount = closecount + 1
if checkmyList.getLast().__str__() == openbrackets[2]:
checkmyList.removeLast()
else:
isEqual = False
'''print checkmyList'''
print opencount
print closecount
if isEqual == False:
print "an extra is missing."
else:
print "win!"
print "Enter myList:"
myList = LinkedList()
while input != "done":
input = raw_input()
if input == "done":
break
myList.addLast(input)
print myList
bracketCheck(myList)
请记住,上面的代码并不是很符合Python的编程风格,甚至可以说不太好。它只是为了让你看到你原代码中的逻辑问题。
如果你想要一个更符合Python风格的解决方案,可以参考@yaks的回答。