使用python3查找数字列表中的第二大数字

时间:2017-01-29 08:19:04

标签: python list python-3.x

我知道这个问题有answers,但我的代码问题是它适用于大多数情况,除非它打印出最大数量。只要列表中的前两个或更多数字是最大值。这可能听起来令人困惑,但这是我的代码示例。

def s_max(l):
    pos = 0
    m1 = max(l)
    m2 = 0
    for i in l:
        pos += 1
        if i > m2 and i != m1:
            m2 = i
        elif m2 == 0 and i == m1 and pos > 1:
            m2 = m1
        elif i < m1 and i <= m2:
            i = m2
        else:
            m2 = m2
    print(m2)

s_max([10,10,9])

OUTPUT = 10

当我使用[9,10,10]等数字列表时,代码将输出9.

5 个答案:

答案 0 :(得分:1)

您可以尝试这样做:

def s_max(l):
    while 1:
        val=max(l)
        l.remove(val)
        if val not in l: break
    return max(l)
output=s_max([10,10,9])
print(output) #prints 9

答案 1 :(得分:1)

您可以创建一个通用函数,通过sorted()使用set()创建函数来获取n最大数字:

def get_n_largest(num_list, n):
    return sorted(set(num_list))[-n]

示例运行:

>>> get_n_largest([9,10,10], 2)
9

答案 2 :(得分:0)

在执行for块之前的if-else循环的第一次迭代中,变量具有以下值:

m1 = 10
m2 = 0
i = 10
pos = 1

这意味着最终else分支被执行,因为它设置了m2=m2没有任何变化。

if-else值之前的第二次迭代中<{>>除了 pos = 2之外。现在这会导致第二个分支执行:

elif m2 == 0 and i == m1 and pos > 1:
    m2 = m1

您已将m2设置为已找到的最大值。在第三次迭代中,if-else块中的第三个分支被执行,由于您只是为循环变量赋值,因此不会改变任何内容。

如果两个第一个值是列表中的最大项,则所有代码都会失败。如果m2大于当前i但小于最大值,则只需设置m2即可进行最少的修改:

def s_max(l):
    m1 = max(l)
    m2 = 0
    for i in l:
        if m2 < i < m1:
            m2 = i

    print(m2)

如果您不想编写自己的功能,可以使用heapq.nlargest

>>> import heapq
>>> l = [10, 10, 9]
>>> heapq.nlargest(2, set(l))[1]
9

请注意,上面假设您的列表中有两个唯一值。

答案 3 :(得分:0)

您可以通过排序找到第二大数字

>>> l = [1, 9, 8, 5, 2, 1, 7]
>>> second_largest_number = sorted(l)[-2]
>>> print(second_largest_number)
Output: 8

您可以使用以下功能而无需使用排序

def f(l):
  a = l[0]
  b = l[0]
  for i in l:
    if i > a and i > b:
       b = a
       a = i
    elif i > b:
       b = i
    elif b == a:
       b = i
  return b

>>> l = [1, 9, 8, 5, 2, 1, 7]
>>> f(l)
Output: 8

答案 4 :(得分:0)

方式没有使用刚排序和设置:

l=[9, 10, 10, 11, 12, 12, 11]
sorted(set(l))[-2]

输出:

11