Python 列表中第二小的元素

Python 列表中第二小的元素,python,list,Python,List,我必须找到二年级学生的名字。我的代码在一些测试用例中运行良好,但这一个尤其让我感到困扰: 四, 雷切尔 -50 马沃 -50 光泽 -50 沙欣 五十一 返回的输出是 马沃 雷切尔 光泽 Shaheen的成绩排名第二,应该是第二名。我不知道我哪里做错了。此外,我在分数作为浮点输入时遇到问题: 四, 沙达布 8. 瓦伦 8.9 萨维什 9.5 严厉的 十, 当输出应为Varun时,抛出的输出为Sarvesh import heapq # range(int(input())): n = int(i

我必须找到二年级学生的名字。我的代码在一些测试用例中运行良好,但这一个尤其让我感到困扰:

四, 雷切尔 -50 马沃 -50 光泽 -50 沙欣 五十一

返回的输出是

马沃 雷切尔 光泽

Shaheen的成绩排名第二,应该是第二名。我不知道我哪里做错了。此外,我在分数作为浮点输入时遇到问题:

四, 沙达布 8. 瓦伦 8.9 萨维什 9.5 严厉的 十,

当输出应为Varun时,抛出的输出为Sarvesh

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)