[Tutor] IndexError: list index out of range

Michael Langford mlangford.cs03 at gtalumni.org
Thu Sep 20 02:22:16 CEST 2007


You should check if the stack is empty before you access it:

def popNum(num):
   if len(stackA) > 0 and num == stackA[-1]:
       stackA.pop()
   #etc

      --Michael

-- 
Michael Langford
Phone: 404-386-0495
Consulting: http://www.TierOneDesign.com/
Entertaining: http://www.ThisIsYourCruiseDirectorSpeaking.com

On 9/19/07, bhaaluu <bhaaluu at gmail.com> wrote:
>
> Greetings,
> I'm working with Python 2.4.3 on the GNU/Linux platform.
> I'm currently playing with functions and stacks, and am
> using the "Towers of Hanoi" as a test game to play with.
> Note: This game is not a recursive programming exercise,
>        it is meant to be solved by the player, manually.
>
> The game asks for a number to move, and a stack to move it to.
> The game starts out in this state:
> =========================
> A [5, 4, 3, 2, 1] False
> B [] True
> C [] True
> =========================
> Enter number and stack to move it to: 1b
>
> It seems to work fine with my test moves:
>
> 1b 2c 1c 3b 1a 2b 1b 1b 4c 1c 2a 1a 3c 1b 2c 1c 5b
> Which brings the game to this state:
>
> Enter number and stack to move it to: 5b
> 5 B
> A [] True
> B [5] False
> C [4, 3, 2, 1] False
> =========================
>
> Then, in the second round of test moves, it bombs on the first move:
>
> Enter number and stack to move it to: 1b
> 1 B
> Traceback (most recent call last):
>   File "funcStack.py", line 73, in ?
>     moveNum(num,abc)
>   File "funcStack.py", line 52, in moveNum
>     popNum(num)
>   File "funcStack.py", line 32, in popNum
>     if num == stackA[-1]:
> IndexError: list index out of range
>
> The second round of test moves are:
> 1b 2a 1a 3b 1c 2b 1b 4a 1a 2c 1c 3a 1b 2a 1a 5c
> The third round of test moves are:
> 1b 2c 1c 3b 1a 2b 1b 1b 4c 1c 2a 1a 3c 1b 2c 1c
> Which should bring the game to this state:
> =========================
> C [] True
> B [] True
> A [5, 4, 3, 2, 1] False
> =========================
>
> Here is my Python source code:
> # funcStacks.py
> # passing parameters, returning values, pushing and popping
> # 2007-09-19
> # b h a a l u u at g m a i l dot c o m
> ######################################
> """
> Pseudocode
> 1. Get the number to move and the column to move it to: 1b, 2c, etc.
> 2. Find the column the number is in: A, B, or C
> 3. Is it the last number (ie. can it be popped?) num == stackA[-1]
> 4.   If the number can be popped, pop it!        stackA.pop()
> 5.   Else, number is buried: return an error and try again.
> 6. Determine if the number can be legally moved to the column requested.
> 7.   If the column is empty, move the number:    stackB.append(num)
> 8.   If the column has a number, is it larger?   stackB.append(num)
> 9.   Else if number in column is smaller,  return an error and try again.
> 10. Loop.
> """
> num = 0
> abc = ""
> EMPTY = []
> stackA = []
> stackB = []
> stackC = []
>
> def isEmpty(stack):
>     if stack == EMPTY:
>         return True
>     else:
>         return False
>
> def popNum(num):
>     if num == stackA[-1]:
>         stackA.pop()
>     elif num == stackB[-1]:
>         stackB.pop()
>     elif num == stackC[-1]:
>         stackC.pop()
>     else:
>         return "Error: number not available."
>
> def pushNum(num,abc):
>     if abc == 'C':
>         stackC.append(num)
>     elif abc == 'B':
>         stackB.append(num)
>     elif abc == 'A':
>         stackA.append(num)
>     else:
>         return "Move not allowed, try again."
>
> def moveNum(num,abc):
>     popNum(num)
>     pushNum(num,abc)
>     return stack_status()
>
> def stack_status():
>     print "A",stackA, isEmpty(stackA)
>     print "B",stackB, isEmpty(stackB)
>     print "C",stackC, isEmpty(stackC)
>
> # main
> print '='*25
> stackA=[5,4,3,2,1]
> stack_status()
> print '='*25
>
> myMove = raw_input('Enter number and stack to move it to: ')
> while myMove != 'Q':
>     num = int(myMove[0])
>     abc = str.upper(myMove[1])
>     print num, abc
>     moveNum(num,abc)
>     print '='*25
>     myMove = raw_input('Enter number and stack to move it to: ')
>
> Remember, I'm learning Python. I haven't studied OOP yet, so
> suggestions to make a class out of it won't help me much. =)
> --
> bhaaluu at gmail dot com
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20070919/d6f90df7/attachment.htm 


More information about the Tutor mailing list