如何打印所有最高价值的地方

时间:2018-02-11 16:54:43

标签: python-3.x

我无法弄清楚如何让python打印所有最高值,因为它只打印它遇到的第一个值。

它从以下几行的文件中获取标准输入: 89 Michael Dunne(等级名称)

我知道我可以使用zip功能,但我无法弄清楚如何只从中打印名称

如果我添加“highstudents = sorted(zip(grade,name),reverse=True)”,它会从高到低排序,但我不知道如何过滤名称,因为它打印为“(89,'Pepe')”

以下代码是目前为止的以下尝试。

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()

1 个答案:

答案 0 :(得分:1)

不是试图将学生和商标保存在2个单独的列表中(存在失控的风险),最好使用字典 - 其中键是标记,值是学生列表(s)谁获得该商标。

然后,只需打印出最高的密钥和相关的学生列表即可。我使用defaultdict作为比为每个值创建或附加到列表更容易的选项。

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()