Reputation: 89
I want to take a input of a number, and compare it with a list which has two starting values of 0 and 0. If the number is larger than list[0]
replace list[0]
with number. Do this also for list[1]
. If a negative number is entered, end the loop and print the list with the new numbers. If less than two positive numbers have been entered before a negative number, print a statement to that effect.
I also want the computer to then display the new list.
The problem is this, the first number I enter is being ignored by the code and not captured into the list, I am unsure why. I have my code included as well as the results from running the code below.
def printTwoLargest():
number = eval(input('Please enter a number'))
largest = [0,0]
while number > -1:
if number > largest[0]:
largest[1] = largest[0]
print (largest) #remove after debug
largest[0] = number
elif number > largest[1]:
print (largest) # remove after debug
largest[1] = number
number = eval(input('Please enter a number'))
if largest[0] == 0 or largest [1] == 0:
print('You have not entered enough positive numbers, please enter at least two positive numbers')
else:
print (largest)
## print statements are a debug test. Cant figure out why, but it seems largest[0]
## and largest[1] are not filled until the 3rd postive number input. It should be
## the second one.
and the results in the shell after running:
>>> printTwoLargest()
Please enter a number 5
[0, 0]
Please enter a number 4
[5, 0]
Please enter a number 6
[5, 5]
Please enter a number -1
[6, 5]
>>> printTwoLargest()
Please enter a number 9
[0, 0]
Please enter a number 8
[9, 0]
Please enter a number -1
You have not entered enough positive numbers, please enter at least two positive numbers
>>> printTwoLargest()
Please enter a number -1
You have not entered enough positive numbers, please enter at least two positive numbers
Upvotes: 0
Views: 188
Reputation: 31339
Short version is listed in the end.
This part messes up having the actual two largest numbers:
if number > largest[0]:
# you're losing largest[1] here
# but it may not be smaller than largest[0] (example: [4,9] -> [number, 4])
largest[1] = largest[0]
largest[0] = number
elif number > largest[1]:
print (largest) # remove after debug
largest[1] = number
One way to work around it and keeping the code similar to what you have (it can be further improved, but more editing is needed) - is using a carry-like behaviour by saying "OK, we have something bigger than this one, but is this bigger than the one on the right?". We leave out the sorting to the end of the insertion process.
So we get this:
if number > largest[0]:
carry = largest[0]
largest[0] = number
# compare carried number to next number, remove if needed
if carry > largest[1]:
largest[1] = carry
elif number > largest[1]:
largest[1] = number
number = eval(input('Please enter a number'))
# sort the numbers
largest = sorted(largest)
if largest[0] == 0 or largest [1] == 0:
print('You have not entered enough positive numbers, please enter at least two positive numbers')
else:
print (largest)
And the entire code:
def printTwoLargest():
number = int(input('Please enter a number'))
largest = [0,0]
while number > -1:
if number > largest[0]:
carry = largest[0]
largest[0] = number
# compare carried number to next number, remove if needed
if carry > largest[1]:
largest[1] = carry
elif number > largest[1]:
largest[1] = number
print(largest)
number = eval(input('Please enter a number'))
# sort the numbers
largest = sorted(largest)
if largest[0] == 0 or largest [1] == 0:
print('You have not entered enough positive numbers, please enter at least two positive numbers')
else:
print (largest)
If you need the short version:
def printTwoLargest():
largest = [0,0]
while True:
number = eval(input('Please enter a number'))
if number < 0:
break
largest = sorted(largest + [number])[-2:]
if 0 in largest:
print('You have not entered enough positive numbers, please enter at least two positive numbers')
else:
print (largest)
Upvotes: 0
Reputation: 11691
I THINK I know the behavior you wanted and have adjusted the code to the following:
def printTwoLargest():
largest = [0,0]
print largest
number = int(input('Please enter a number\n'))
while number > -1:
if number > largest[1]:
largest[0] = largest[1]
largest[1] = number
elif number > largest[0]:
largest[0] = number
print largest
number = int(input('Please enter a number'))
if largest[0] == 0 or largest [1] == 0:
print('You have not entered enough positive numbers, please enter at least two positive numbers')
else:
print (largest)
What this code does is takes the new number and first compares to the highest one (the one on the right or index 1). If it's not higher than that, it checks against the lower (index 0). This will only update 1 at a time. This is how it looks after some input
In [3]: printTwoLargest()
[0, 0]
Please enter a number
1
[0, 1]
Please enter a number5
[1, 5]
Please enter a number6
[5, 6]
Please enter a number-1
[5, 6]
Upvotes: 1
Reputation: 1746
Try this:
def printTwoLargest():
number = int(input('Please enter a number'))
largest = [0,0]
while number > -1:
if number > largest[0]:
largest[1] = largest[0]
largest[0] = number
print (largest) #remove after debug
elif number > largest[1]:
largest[1] = number
print (largest) # remove after debug
number = int(input('Please enter a number'))
if largest[0] == 0 or largest[1] == 0:
print('You have not entered enough positive numbers, please enter at least two positive numbers')
else:
print (largest)
Output:
C:\Users\so>C:\Python27\python.exe ptl.py
Please enter a number6
[6, 0]
Please enter a number4
[6, 4]
Please enter a number-1
[6, 4]
C:\Users\so>
Upvotes: 1