'Python Code line by line meaning

I have got a code and need to get the line by line meaning of this python code.

marksheet = []
for i in range(0,int(input())):
    marksheet.append([raw_input(), float(input())])

second_highest = sorted(list(set([marks for name, marks in marksheet])))[1]
print('\n'.join([a for a,b in sorted(marksheet) if b == second_highest]))


Solution 1:[1]

I highly recommend you to go through the python tutorial

Just for your understanding of this code, I've added the comments.

#initialising an empty list!
marksheet = [] 

#iterating through a for loop starting from zero, to some user input(default type string) - that is converted to int
for i in range(0,int(input())): 
    #appending user input(some string) and another user input(a float value) as a list to marksheet
    marksheet.append([raw_input(), float(input())]) 

#[marks for name, marks in marksheet] - get all marks from list
#set([marks for name, marks in marksheet]) - getting unique marks
#list(set([marks for name, marks in marksheet])) - converting it back to list
#sorting the result in decending order with reverse=True and getting the value as first index which would be the second largest.
second_highest = sorted(list(set([marks for name, marks in marksheet])),reverse=True)[1] 

#printing the name and mark of student that has the second largest mark by iterating through the sorted list.
#If the condition matches, the result list is appended to tuple  -`[a for a,b in sorted(marksheet) if b == second_highest])` 
#now join the list with \n - newline to print name and mark of student with second largest mark
print('\n'.join([a for a,b in sorted(marksheet) if b == second_highest]))

Hope it helps!

Solution 2:[2]

Would do this in a comment but I don't have 50 reputation yet:

You don't need to use sorted on second_highest but apparently it is not a good habit to rely on this so you can keep the sorted. Calling sorted on an already sorted list doesn't use a lot of resources anyway.

second_highest = sorted(list(set([marks for name, marks in marksheet])))[1]

Also if the list contains something like [1,3,2,5,3,2,1] it will give 2 as result and not 1 since a set removes all duplicates.

If you want to keep duplicates use:

second_highest = sorted([marks for name, marks in marksheet]))[1]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2