【问题标题】:How to print all the highest value places如何打印所有最高价值的地方
【发布时间】:2018-02-11 16:54:43
【问题描述】:

我不知道如何让 python 打印所有最高值,因为它只打印遇到的第一个值。

它从包含以下几行的文件中获取标准输入: 89 迈克尔·邓恩(年级名)

我知道我可以使用 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()

【问题讨论】:

  • 您的代码不起作用吗?怎么样?
  • 它有效但只打印一个人的最高价值,我希望它打印每个人的最高价值。例如,如果我有 5 名学生,其中 2 人的成绩为 88,则将打印第一个 88 的人,而另一个人不会。
  • 我找到了类似question 的答案。您可能会发现它很有帮助。

标签: python-3.x


【解决方案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()

【讨论】:

  • 这是一种非常简洁的方式,我没想到。我必须在没有括号的情况下打印学生姓名,如果 .strip 或 .replace 不起作用,我该怎么办?
  • 我更新了答案,将学生打印为逗号分隔的列表,而不是列表本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2022-06-12
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多