Christopher Jakob
Christopher Jakob

Reputation: 89

python first entry in array not being captured

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

Answers (3)

Reut Sharabani
Reut Sharabani

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

sedavidw
sedavidw

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

Joaquin Sargiotto
Joaquin Sargiotto

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

Related Questions