1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Writing a procedure in python

  1. Dec 20, 2016 #1
    1. The problem statement, all variables and given/known data
    Define a procedure that does the following:
    From the string of numbers from 1 - 9 it creates a list that contains the numbers that are bigger than the preceding number and adds the smaller ones to a sub-list. Example:
    string='3057842103'
    print(numbers_in_list(string))
    >>>[3,[0],5,7,8,[4,2,1,0,3]]
    This is a Udacity CS101 problem from the ProblemSet in Lecture 3 named, Numbers in List.
    2. Relevant equations
    3. The attempt at a solution

    Code (Python):

    def numbers_in_lists(string):
       list=[int(string[0])]
       list2=[]
       a=int(string[0])
       i=1
       while i<len(string):
         if a<int(string[i]):
           a=int(string[i])
           list.append(int(string[i]))
           list2=[]
           i+=1
         if a>=int(string[i]):
           list2.append(int(string[i]))
           if list2 not in list:
             list.append(list2)
           i+=1
       return list      
     
    When i run print(numbers_in_list(3057842103)) i get the correct result but when i copy it and paste it in the udacity python it looks like this:
    Code (Python):

     
    # Numbers in lists by SeanMc from forums
    # define a procedure that takes in a string of numbers from 1-9 and
    # outputs a list with the following parameters:
    # Every number in the string should be inserted into the list.
    # If a number x in the string is less than or equal
    # to the preceding number y, the number x should be inserted
    # into a sublist. Continue adding the following numbers to the
    # sublist until reaching a number z that
    # is greater than the number y.
    # Then add this number z to the normal list and continue.

    #Hint - "int()" turns a string's element into a number

    def numbers_in_lists(string):
       list=[int(string[0])]
       list2=[]
       a=int(string[0])
       i=1
       while i<len(string):
         if a<int(string[i]):
           a=int(string[i])
           list.append(int(string[i]))
           list2=[]
           i+=1
         if a>=int(string[i]):
           list2.append(int(string[i]))
           if list2 not in list:
             list.append(list2)
           i+=1
       return list
               
    #testcases
    string = '543987'
    result = [5,[4,3],9,[8,7]]
    print repr(string), numbers_in_lists(string) == result
    string= '987654321'
    result = [9,[8,7,6,5,4,3,2,1]]
    print repr(string), numbers_in_lists(string) == result
    string = '455532123266'
    result = [4, 5, [5, 5, 3, 2, 1, 2, 3, 2], 6, [6]]
    print repr(string), numbers_in_lists(string) == result
    string = '123456789'
    result = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    print repr(string), numbers_in_lists(string) == result
     
    Now when i run i get this:
    Code (Python):

    Traceback (most recent call last): File "vm_main.py", line 33, in <module> import main File "/tmp/vmuser_kzfoxtgohv/main.py", line 44, in <module> print repr(string), numbers_in_lists(string) == result File "/tmp/vmuser_kzfoxtgohv/main.py", line 25, in numbers_in_lists if a>=int(string[i]): IndexError: string index out of range
    '543987' True '987654321' True '455532123266' True '123456789'
     
    What is going on here, kinda weirded out..o_O
     
  2. jcsd
  3. Dec 20, 2016 #2

    jedishrfu

    Staff: Mentor

    Look at your code again especially the line:

    in numbers_in_lists if a>=int(string [ i ]): IndexError: string index out of range

    and see if the could get out of range somehow.

    You could also place print statements in your code to see the variables are set to.

    One thing I noticed is that right before this line you have i+=1; and then you have the failure.

    the i+=1 could now be equal to the length of the string and hence would index character past it a kind of edge case.
     
  4. Dec 20, 2016 #3

    phyzguy

    User Avatar
    Science Advisor

    It seems to me it should always fail. Suppose the string has 5 elements. Then in the while statement, you can have i=4. You do the first if statement, then increment i, so now i=5. Then you ask if a>=int(string):. But string only has 5 elements, so there is no string[5]. How did it ever work?
     
  5. Dec 21, 2016 #4
    I added a line under i+=1 to check for the length and if it exceeds it breaks. Works now. Thanks for the help :)!
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: Writing a procedure in python
  1. Python Beginner (Replies: 3)

  2. Python question (Replies: 1)

Loading...