Python 打印列表中第二个最低的数字

Python 打印列表中第二个最低的数字,python,python-3.x,Python,Python 3.x,我是python新手,我一直强迫自己先使用逻辑来解决问题 我一直在试图找出最好的方法来比较列表中的浮点数,以从列表中获得最低秒数 数字=[40,40,10,10,21,21100100400400,15,15] 从上面的列表中,我想得到:15和15,因为它们都是最低的数字。我不在乎它们是否重复,所以不需要使用set删除重复项 我的做法: 我考虑了一个for循环并进行了比较,但我被卡住了。也许enumerate可以帮我比较一下这些数字 此外,您建议如何改进逻辑以解决问题?到目前为止,我一直在关注h

我是python新手,我一直强迫自己先使用逻辑来解决问题

我一直在试图找出最好的方法来比较列表中的浮点数,以从列表中获得最低秒数

数字=[40,40,10,10,21,21100100400400,15,15]

从上面的列表中,我想得到:15和15,因为它们都是最低的数字。我不在乎它们是否重复,所以不需要使用set删除重复项

我的做法:

我考虑了一个for循环并进行了比较,但我被卡住了。也许enumerate可以帮我比较一下这些数字

此外,您建议如何改进逻辑以解决问题?到目前为止,我一直在关注hackerrank练习

谢谢大家!

你可以用

第二个=分类设置编号[1] [如果i==第二个最小值,则i代表数字中的i] 解释:

SetNumber将删除重复项 sorted将对列表asc进行排序 然后我们只是在它们上面循环,只过滤第二个最小的 HackerRank是您改进的好地方,但您也应该参与其他具有更广泛测试和挑战的项目。堆栈溢出是一个很好的地方:

您可以使用

第二个=分类设置编号[1] [如果i==第二个最小值,则i代表数字中的i] 解释:

SetNumber将删除重复项 sorted将对列表asc进行排序 然后我们只是在它们上面循环,只过滤第二个最小的
HackerRank是您改进的好地方,但您也应该参与其他具有更广泛测试和挑战的项目。堆栈溢出是一个很好的地方:

您可以执行以下操作:

sorted(set(numbers))[1]
setnumbers从列表中创建一个集合:每个值只保留一个 sortedsetnumbers将值从最小值排序到最高值 sortedsetnumbers[1]检索第二个最低值
您可以执行以下操作:

sorted(set(numbers))[1]
setnumbers从列表中创建一个集合:每个值只保留一个 sortedsetnumbers将值从最小值排序到最高值 sortedsetnumbers[1]检索第二个最低值 这将给出答案,而不考虑重复项


无论答案是否重复,这都将给出一个有效的解决方案:

>>> s = set(numbers)
>>> s.remove(min(s))
>>> x = min(s)
>>> [x] * numbers.count(x)
[15, 15]
或使用O1空间:

>>> x = min(numbers)
>>> y = min(y for y in numbers if y != x)
>>> [y] * numbers.count(y)
[15, 15]

有效的解决方案:

>>> s = set(numbers)
>>> s.remove(min(s))
>>> x = min(s)
>>> [x] * numbers.count(x)
[15, 15]
或使用O1空间:

>>> x = min(numbers)
>>> y = min(y for y in numbers if y != x)
>>> [y] * numbers.count(y)
[15, 15]

由于您是一名初学者,除了内置的方法外,您可能还想学习如何思考这些问题,因此这里有一种方法不使用预先编写的函数对列表进行排序。我们将在列表上循环,并跟踪最小和次最小的项目

smallestnum = [numbers[0]] # This will keep track of all smallest numbers we've found
secsmallest = [numbers[0]] # This will hold all second-smallest numbers we find
for element in numbers:
    if element < smallestnum[0]:
        # This is the new minimum
        # So the old minimum is now the second-smallest
        secsmallest = smallestnum
        smallestnum = [element]
    elif element == smallestnum[0]:
        # Add this number to our list of smallests
        smallestnum.append(element)
    elif element < secsmallest[0]:
        # This is the new second-smallest
        secsmallest = [element]
    elif element == secsmallest[0]:
        # Add this to our list of 2nd smallest
        secsmallest.append(element)
    # else do nothing

由于您是一名初学者,除了内置的方法外,您可能还想学习如何思考这些问题,因此这里有一种方法不使用预先编写的函数对列表进行排序。我们将在列表上循环,并跟踪最小和次最小的项目

smallestnum = [numbers[0]] # This will keep track of all smallest numbers we've found
secsmallest = [numbers[0]] # This will hold all second-smallest numbers we find
for element in numbers:
    if element < smallestnum[0]:
        # This is the new minimum
        # So the old minimum is now the second-smallest
        secsmallest = smallestnum
        smallestnum = [element]
    elif element == smallestnum[0]:
        # Add this number to our list of smallests
        smallestnum.append(element)
    elif element < secsmallest[0]:
        # This is the new second-smallest
        secsmallest = [element]
    elif element == secsmallest[0]:
        # Add this to our list of 2nd smallest
        secsmallest.append(element)
    # else do nothing

@Tibebes.M不会工作,因为列表中有两个10。和sorted将只返回一个值,而不是both@Tibebes.M我读了:我想得到:15和15,因为它们都是最低的数字。@tibebs.M不起作用,因为列表中有两个10。和sorted将只返回一个值,而不是both@Tibebes.M我读到了:我想得到:15和15,因为它们都是最低的数字。它们不想删除重复项。它们不想删除重复项。最好执行如下操作:num=sortedsetnumbers[1];[num]*数字。countnum@Tomerikoo你觉得我做的编辑怎么样?我认为循环在这种情况下更容易理解。这比以前更具可读性和效率:谢谢Gustavo,看起来你的解决方案帮助我向前迈进了!最好执行如下操作:num=sortedsetnumbers[1];[num]*数字。countnum@Tomerikoo你觉得我做的编辑怎么样?我认为循环在这种情况下更容易理解。这比以前更具可读性和效率:谢谢Gustavo,看起来你的解决方案帮助我向前迈进了!虽然只使用代码的答案可能会回答这个问题,但您可以通过提供代码的上下文、此代码工作的原因以及供进一步阅读的一些文档参考来显著提高答案的质量。简洁是可以接受的,但更全面的解释更好。请拿着这本书读一读。欢迎来到堆栈溢出!虽然只使用代码的答案可能会回答这个问题,但您可以通过提供代码的上下文、此代码工作的原因以及供进一步阅读的一些文档参考来显著提高答案的质量。简洁是可以接受的,但更全面的解释更好。请拿着这本书读一读。欢迎来到堆栈溢出!