KyleMcCann
KyleMcCann

Reputation: 39

How to print all the highest value places

I cannot figure out how to get python to print all the highest values as it only prints the first one it encounters.

It takes standard input from a file that has on a few lines the following: 89 Michael Dunne (grade name)

I know I can use the zip function but I cannot figure out how only print the name from it

If I add "highstudents = sorted(zip(grade,name),reverse=True)" it sorts from high to low but I do not know how to filter the name out as it prints as "(89, 'Pepe')"

The code below is the following attempt so far.

import sys

def topgrade(x):
    s = max(x)
    return s


def main():
    s = sys.argv[1]
    grade=[]
    name = []
    try:    
        with open(s,'r') as studata:
            for line in studata:
                try:
                    line = line.strip()
                    grade.append(int(line[0:2]))
                    name.append(line[3::])

                except ValueError:
                    print("Invalid mark",line[0:2],"encountered. Skipping.")
            top = topgrade(grade)
            a = grade.index(top)

            print("Best students:",name[a])
            print("Best mark:",top)

    except FileNotFoundError:
        print("File not found:",s)


if __name__ == '__main__':
    main()

Upvotes: 1

Views: 98

Answers (1)

match
match

Reputation: 11060

Rather than trying to keep the students and marks in 2 separate lists (with the risk that they get out of step) it is better to use a dictionary - where the key is the mark and the value is a list of the student(s) who obtained that mark.

Then it is a simple task of just printing out the highest key, and the associated list of students. I'm using defaultdict as an easier option than having to create or append to the list for each value.

from collections import defaultdict
import sys

def main():
    s = sys.argv[1]
    grades = defaultdict(list)
    try:
        with open(s,'r') as studata:
            for line in studata:
                try:
                    line = line.strip()
                    grades[int(line[0:2])].append(line[3::])

                except ValueError:
                    print("Invalid mark",line[0:2],"encountered. Skipping.")

        top_mark = max(grades.keys())
        print("Best students:{}".format(','.join(grades[top_mark])))
        print("Best mark: {}".format(top_mark))

    except FileNotFoundError:
        print("File not found:",s)

if __name__ == '__main__':
    main()

Upvotes: 1

Related Questions