Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回列表中的第二大_Python_Python 3.x - Fatal编程技术网

Python 返回列表中的第二大

Python 返回列表中的第二大,python,python-3.x,Python,Python 3.x,这是我从列表中获取第二大元素的代码。 我假设一个列表至少有两个元素。 但是,它从下面的输入中给出的是“gamma”而不是“delta” def second_largest(nums): the, sec = 0, 0 if nums[0] > nums[1]: the, sec = nums[0], nums[1] else: the, sec = nums[1], nums[0] for num in nums:

这是我从列表中获取第二大元素的代码。 我假设一个列表至少有两个元素。 但是,它从下面的输入中给出的是“gamma”而不是“delta”

def second_largest(nums):
    the, sec = 0, 0
    if nums[0] > nums[1]:
        the, sec = nums[0], nums[1]
    else:
        the, sec = nums[1], nums[0]

    for num in nums:
        if num > sec:
            if num >= the:
                the, sec = num, the
            else:
                sec = num
    return sec

您已按适当的顺序将最大值和第二大值初始化为前两项,但随后将它们再次包含在循环中。如果最大值也是前两个值之一,则它将占用该点之后的两个插槽。您可以通过显式地从列表中创建迭代器并为前两个元素推进它来修复它:

print(second_largest(['alpha', 'gamma','beta','delta']))
通过不使用索引访问,这还具有处理任何iterable的优点


对于实际使用,请参阅,它甚至在CPython中对少量元素进行了特定的优化。

一个简单的方法是找到max并删除它。查找最大值在o(n)上

第二次:

>>> x=['alpha', 'gamma','beta','delta']
>>> m=x[0]
>>> for i in x:
    if i > m:
        m=i

>>> x.remove(m)

o(n)+…+o(n)->L*o(n)->o(n)

好吧,把你的算法写在纸上。你得到了什么?为什么不把
排序(['alpha','gamma','beta','delta',reverse=True)[1]
?@zwer:时间和空间复杂度更高。@zwer:谁说这还为时过早?无论如何,这是一个以获得O(n)为目标的家庭作业,这是一个更好的机会。如果我们使用内置优化,请参见
heapq.nlagest
这是否按预期工作<代码>第二大(['alpha','gamma','beta','delta','echo'])返回
echo
@cricket\u 007:是的,因为“g”在“e”之后。嗯。我想时间不早了;)
>>> x=['alpha', 'gamma','beta','delta']
>>> m=x[0]
>>> for i in x:
    if i > m:
        m=i

>>> x.remove(m)
>>> m=x[0]
>>> for i in x:
    if i > m:
        m=i
>>> print(m) #scond max