【发布时间】:2020-05-23 00:08:26
【问题描述】:
给定物理课学生中每个学生的姓名和成绩,将它们存储在嵌套列表中,并打印任何成绩第二低的学生的姓名。
注意:如果有多个年级相同的学生,请按字母顺序排列他们的姓名并将每个姓名打印在新行上。
输入格式
第一行包含一个整数,学生人数。 随后的几行逐行描述了每个学生;第一行包含学生的姓名,第二行包含他们的成绩。
约束
总会有一名或多名学生成绩倒数第二。
输出格式
打印物理成绩第二低的任何学生的姓名;如果有多个学生,请按字母顺序排列他们的姓名,并将每个学生都打印在新行上。
示例输入
5
Harry
37.21
Berry
37.21
Tina
37.2
Akriti
41
Harsh
39
样本输出
Berry
Harry
这是我解决问题的代码:
if __name__ == '__main__':
list = []
for _ in range(int(input())):
name = input()
score = float(input())
#list = []
list.append([name, score])
#print(list)
list.sort(key = lambda x: float(x[1]))
#print(list)
new_lst = []
for i in range(len(list)):
for j in range(1):
if list[i][1] == list[1][1]:
new_lst += [list[i][0]]
#print(new_lst)
sorted_lst = sorted(new_lst)
#print(sorted_lst)
for student in sorted_lst:
print(student)
10 个测试用例(测试 2 和 3)中有 2 个代码失败。以下是测试 2 和 3 的情况:
样本输入(测试 2)
5
Harsh
20
Beria
20
Varun
19
Kakunami
19
Vikas
21
样本输出(测试 2)
Beria
Harsh
样本输入(测试 3)
4
Rachel
-50
Mawer
-50
Sheen
-50
Shaheen
51
样本输出(测试 3)
Shaheen
但是,我无法弄清楚为什么这 2 个测试用例不起作用,因为我认为我已经很好地涵盖了边界测试用例。尽管包括上面的第一个测试用例,但我的代码确实通过了 10 次测试中的 8 次。
我有什么遗漏吗?
编辑
我想出了一个方法来通过剩下的测试用例(我修改过的代码):
if __name__ == '__main__':
lst = []
for _ in range(int(input())):
name = input()
score = abs(float(input()))
#lst = []
lst.append([name, score])
#print(lst)
lst.sort(key = lambda x: float(x[1]))
#print(lst)
#lst.remove(min(lst))
#print(lst)
new_lst = []
min_mark = lst[0][1]
count = 0
for i in range(len(lst)):
if min_mark == lst[i][1]:
count = count+1
if count > 1:
for j in range(count - 1):
lst.pop(0)
#print(lst)
for i in range(len(lst)):
for j in range(1):
if lst[i][1] == lst[1][1]:
new_lst += [lst[i][0]]
#print(new_lst)
sorted_lst = sorted(new_lst)
#print(sorted_lst)
for student in sorted_lst:
print(student)
您如何看待这个最终代码?够好吗?还是应该缩短?
【问题讨论】:
-
我认为您还没有充分涵盖“所有”边缘情况。你假设第二低的成绩将是排序列表中的第二项(即你总是假设
list[1][1]是第二低的——这就是你无法通过测试的地方。提示:最低成绩也可能是两倍,然后你的第二低成绩实际上可能是指数!= 1 ;) -
另外,不要将名称
list用于您的变量。您正在覆盖 Python 提供的list函数。 -
@DewMan 我发布我的答案只是尝试一下,因为这两个答案都通过了我提交的所有案例。
标签: python nested-lists