返回列表中的第二大

时间:2017-07-23 03:38:29

标签: python python-3.x

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

这是我从列表中获取第二大元素的代码。 我假设一个列表至少有两个元素。 但是,它给了我'伽玛'不是' delta'来自下面的输入。

print(second_largest(['alpha', 'gamma','beta','delta']))

2 个答案:

答案 0 :(得分:6)

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

def second_largest(nums):
    it = iter(nums)
    sec, the = sorted((next(it), next(it)))

    for num in it:
        if num > sec:
            if num >= the:
                the, sec = num, the
            else:
                sec = num

    return sec

通过不使用索引访问,这也具有处理任何可迭代的优势。

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

答案 1 :(得分:0)

一种简单的方法是找到最大值并将其删除。找到最大值是o(n)

>>> 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

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