我无法弄清楚如何让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()
答案 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()