Great, glad to hear it's working now! Happy coding :)

Click For Summary

Discussion Overview

The discussion revolves around a coding problem from a Udacity course, where participants are tasked with defining a procedure that processes a string of numbers from 1 to 9. The goal is to create a list that separates numbers greater than the preceding number from those that are smaller, which are collected in a sub-list. The conversation includes attempts at a solution, debugging issues, and clarifications on the code's behavior.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant presents a code implementation for the problem, detailing how it is supposed to work with examples.
  • Another participant points out a potential issue with the code, suggesting that the index variable 'i' could exceed the length of the string, leading to an IndexError.
  • A different participant agrees with the concern, explaining that if 'i' reaches the length of the string, it would attempt to access an out-of-bounds index, which should always result in failure.
  • One participant mentions adding a check for the index length to prevent the error, indicating that this modification resolved the issue.

Areas of Agreement / Disagreement

Participants generally agree on the existence of an error in the code related to index management, but there is no consensus on how the code appeared to work initially despite the apparent flaw.

Contextual Notes

The discussion highlights the importance of managing loop indices correctly in programming, particularly in relation to string lengths. The specific conditions under which the code may have functioned without error initially remain unclear.

doktorwho
Messages
181
Reaction score
6

Homework Statement


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.

Homework Equations


3. The Attempt at a Solution [/B]
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:
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:
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
 
Technology news on Phys.org
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.
 
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?
 
jedishrfu said:
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.

phyzguy said:
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?
I added a line under i+=1 to check for the length and if it exceeds it breaks. Works now. Thanks for the help :)!
 

Similar threads

  • · Replies 31 ·
2
Replies
31
Views
7K
  • · Replies 3 ·
Replies
3
Views
3K
Replies
1
Views
2K
  • · Replies 11 ·
Replies
11
Views
1K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 3 ·
Replies
3
Views
5K
  • · Replies 17 ·
Replies
17
Views
4K
  • · Replies 97 ·
4
Replies
97
Views
10K
  • · Replies 7 ·
Replies
7
Views
5K