Python 列表中第二小的元素
我必须找到二年级学生的名字。我的代码在一些测试用例中运行良好,但这一个尤其让我感到困扰: 四, 雷切尔 -50 马沃 -50 光泽 -50 沙欣 五十一 返回的输出是 马沃 雷切尔 光泽 Shaheen的成绩排名第二,应该是第二名。我不知道我哪里做错了。此外,我在分数作为浮点输入时遇到问题: 四, 沙达布 8. 瓦伦 8.9 萨维什 9.5 严厉的 十, 当输出应为Varun时,抛出的输出为SarveshPython 列表中第二小的元素,python,list,Python,List,我必须找到二年级学生的名字。我的代码在一些测试用例中运行良好,但这一个尤其让我感到困扰: 四, 雷切尔 -50 马沃 -50 光泽 -50 沙欣 五十一 返回的输出是 马沃 雷切尔 光泽 Shaheen的成绩排名第二,应该是第二名。我不知道我哪里做错了。此外,我在分数作为浮点输入时遇到问题: 四, 沙达布 8. 瓦伦 8.9 萨维什 9.5 严厉的 十, 当输出应为Varun时,抛出的输出为Sarvesh import heapq # range(int(input())): n = int(i
import heapq
# range(int(input())):
n = int(input())
builtlist = []
temp= []
names = []
for i in range(0, n):
name = input()
score = float(input())
builtlist.append([name, score])
temp = sorted(builtlist, key = lambda x: x[1])
#minvalue = min(temp, key= lambda x: x[1])
for j in range(len(temp)):
secondsmall = heapq.nsmallest(2, temp)[-1]
if (temp[j][1]==secondsmall[1]):
names.append(temp[j][0])
list = sorted(names)
print(*list, sep = "\n")
我想heapq.n是我用过的最简单的方法,但我不知道它是什么 这里发生了很多事情 首先,stackoverflow不存在来调试您的代码,这是对网站的滥用。请以后不要这样做,并注意
code tags.
其次,heapq.nsmallest()将返回请求的最小元素数。如果两个元素最少,并且共享一个值,那么它们都将被返回。因此,代码按预期运行
我将研究python字典和哈希集来解决这个问题。有一个更优雅的解决方案。您在这里出错了
temp=sorted(buildlist,key=lambda x:x[1])
,heapq.nsmalest(2,temp)
返回temp中的n个最小元素,在您的情况下,它将是[50,50,51]
,因此它将返回[50,50]
使用temp=list(set(temp))
您的代码将正常工作
如果您不想使用heapq,您可以使用此代码获得相同的答案
# range(int(input())):
n = int(input())
builtlist = []
temp= []
names = []
for i in range(0, n):
name = input()
score = float(input())
builtlist.append([name, score])
temp = list(set([x[1] for x in builtlist]))
secondsmall = sorted(temp)[1]
for j in range(len(builtlist)):
if (builtlist[j][1]==secondsmall):
names.append(builtlist[j][0])
list_print = sorted(names)
print(*list_print, sep = "\n")
不需要使用
heapq
:
def second_smallest(builtlist):
# sort on key.
temp = sorted(builtlist, key = lambda x: x[1])
second_smallest_group = []
current_val = 0
# iterate list comparing i with i + 1
for i in range(len(temp) - 1):
current_val = temp[i][1]
# if in set of first smallest ignore.
if current_val == temp[i+1][1] and len(second_smallest_group) == 0:
continue
# if in second set of smallest add.
elif current_val == temp[i+1][1] and len(second_smallest_group) > 0:
second_smallest_group.append(temp[i+1][0])
# if changing between sets add first member.
elif len(second_smallest_group) == 0:
second_smallest_group.append(temp[i+1][0])
# if we move to another group break.
else:
break
return second_smallest_group
builtlist = [["Rachel", -50], ["Mawer", -50], ["Sheen", -50],["Shaheen",51]]
print(second_smallest(builtlist))
builtlist = [["Shadab",8], ["Varun", 8.9], ["Sarvesh", 9.5], ["Harsh",10]]
print(second_smallest(builtlist))
Python中的
heapq
更常见的对应项是
应用程序:
builtlist = [["Rachel", -50], ["Mawer", -50], ["Sheen", -50],["Shaheen", 51]]
second_smallest(builtlist)
# ('Sheen', -50)
builtlist = [["Shadab", 8], ["Varun", 8.9], ["Sarvesh", 9.5], ["Harsh", 10]]
second_smallest(builtlist)
# ('Varun', 8.9)
使用
计数器.most_common()
方法获取最不常见(或最小)的值。这是因为代码没有缩进,这是一个有点哲学的问题;当有许多人得分相同(最低)时,第二小的是什么?你似乎考虑的是分数,而不是人。这很好,但值得考虑。@e4c5它与其他输入一起工作良好。这两个正在制造麻烦。缩进问题,如在何处?如在您的代码中或在您发布的question@JohanL在这种情况下,由于有多个得分相同的人,所有这些人的名字都会被添加到名字列表中。然后,我将得到所有这些名称按字母顺序排序的输出。这是问题的要求之一。嘿,谢谢。它看起来不错,但在secondsmall=sorted(list(set([x[1]表示内置列表中的x]))[1]处抛出错误,因为“list object不可调用”我编辑了我的答案。事实上这应该行得通,我不知道你为什么会出错a=[('asdas',20),('asdasd',40),('fsdgfds',20),('dsada',50)]>>已排序(列表(集合([x[1]表示a中的x]))[1]40>>a=[('asdas',20),('asdasd',40),('fsdgfds',20),('dsada',50)]>>已排序(列表(集合([x[x[1]表示a中的x]))[1]>>40temp=list(集合([x[1]表示内置列表)这非常奇怪。在这里的这一行,它不断抛出列表对象不可调用的错误。我认为list作为一个内置变量可能会被最后声明的list变量所掩盖,但我想还有其他原因。是的,这里可能就是这种情况。在运行程序之前,python会创建一个包含所有变量和方法的\uuu dict\uu
。请避免将关键字用作变量名。编辑了我的代码。我只是添加了我的部分,并使用了您代码中的rest,对此表示抱歉。我不打算滥用任何东西,再加上我的错误。我在这里是个新手,仍然掌握着这里一切的运作方式。
builtlist = [["Rachel", -50], ["Mawer", -50], ["Sheen", -50],["Shaheen", 51]]
second_smallest(builtlist)
# ('Sheen', -50)
builtlist = [["Shadab", 8], ["Varun", 8.9], ["Sarvesh", 9.5], ["Harsh", 10]]
second_smallest(builtlist)
# ('Varun', 8.9)