As usual, without very clear and precise instructions and parameters, the 
answers may not quite fit.
It looks like you are asked two and only two questions.
The first is asking how many numbers you want. 
Before continuing, you need to make sure that is a valid number as many answer 
will throw an exception.
The next line, complex as it is, asks for one long answer and does not check 
anything and breaks rapidly unless you use just normal integer representation. 
Yes, it ignores any entry after the "i"th but if you want valid entries, you 
might want to evaluate them in a loop perhaps one at a time and keep going till 
you have 'i" valid ones.
I do suggest you not use the variable name of "i" for many reasons as modern 
languages allow more meaningful names like, well, "n"!
I understand using i, j, k in some nested loops but here I would haveused 
something like howMany and verified the number was an integer larger than 0.
As for getting the second largest number, there is nothing wrong with 
determining it the hard way. Of course for some people, it is more intuitive to 
sort the uniqued data and simply choose the 2nd entry from the end. Some python 
modules allow you tosee the ranks of various entries and you can simply choose 
the one of second rank. 
But if this is HW, you are being asked to do things the old-fashioned way! LOL!



-----Original Message-----
From: Dennis Lee Bieber <wlfr...@ix.netcom.com>
To: python-list@python.org
Sent: Fri, Apr 15, 2022 2:31 pm
Subject: Re: code confusion

On Fri, 15 Apr 2022 08:41:20 +0100, Tola Oj <ojomooluwatolami...@gmail.com>
declaimed the following:

>i = int(input())

    Obtain a single /integer/ from stdin -- note: any extraneous characters
on the input line will result in a failure to convert from textual
representation to internal/binary integer

>lis = list(map(int,input().strip().split()))[:i]

    Obtain a line from stdin containing space separated /integer/
representations. Split the line at the spaces. Convert each "word" to
internal/binary integer. Keep up to at most "i" integers. Note that the
position of the [:i] could be at 
            ... .split()[:i]
The difference being that the provided code is converting all "words" on
the input into integers and then keeping the first "i"; putting the [:i]
after .split() means only the first "i" words are kept, and hence only that
many need to be converted to integer.

>z = max(lis)

    Determine largest value in the list of integers

>while max(lis) == z:
>lis.remove(max(lis))

    WHILE the largest value in the (current) list matches the initially
determined maximum value... remove that value from the list.

    Rather than repeat "max(lis)" in the .remove() invocation, just pass it
"z" (the WHILE has already confirmed that the maximum "z" is found in the
list, so why recompute the maximum).

    Note: Python indentation is significant -- the above .remove() line
needs to be indented. Presuming your code was properly indented please find
a posting client that doesn't reformat leading indentation.

>
>print (max(lis))
>

    Display the new list maximum value after removing all instances of the
initial maximum value.

>this is an answer to a question from the discussion chat in hackerrank. i
>didn't know the answer so i found an answer that fitted well to the
>question, however i struggle to understand the use of some of the methods
>and functions the person has used. my major questions are: 1. what does
>"[:i]" mean

    Learn the contents of the Library Reference Manual -- you don't need to
memorize it all, but should at least know the major groupings...

https://docs.python.org/3/library/stdtypes.html#common-sequence-operations


>                                                        2. is there
>another i could write this code using if statement?

    There are many ways to rewrite that...

UNTESTED

i = int(input("How many integers are to be considered?"))
ls = [int(wd) for wd in input(
                "enter space separated integers"
                ).split()[:i]]
maximum = max(ls)
while maximum in ls:
    ls.remove(maximum)
print(ls)

    Remove the first line, and the [:i], and the code will happily process
for however many integers are provided on the input line.

    The while/remove loop can be replaced with

ls = [itm for itm in ls if itm != maximum]

which only requires one pass through the list; while/remove has to scan the
list to see if maximum is in it, then has to scan it a second time to for
the .remove() to find where in the list it is found.

    Or...

for _ in range(ls.count(maximum)):
    ls.remove(maximum)

where _ is a "junk/temp" value that we don't care about -- we only want to
loop once for EACH maximum value

    Or...

while maximum in ls:
    del ls[ls.index(maximum)]



-- 
    Wulfraed                Dennis Lee Bieber        AF6VN
    wlfr...@ix.netcom.com    http://wlfraed.microdiversity.freeddns.org/
-- 
https://mail.python.org/mailman/listinfo/python-list
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to