繁体   English   中英

使用python3在数字列表中找到第二大数字

[英]Find the second largest number in a list of numbers using python3

我知道这个问题有答案 ,但是我的代码存在的问题是,它可以在大多数情况下工作,除非打印出最大数量。 只要列表中的前两个或更多为最大。 听起来可能有些混乱,但这是我的示例代码。

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。

您可以尝试这样做:

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

您可以通过使用sorted()set()将函数创建为一个函数来获得第n个最大数字,如下所示:

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

样品运行:

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

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

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

这意味着将执行最后的else分支,并且由于它设置了m2=m2没有任何变化。

在第二次迭代中, if-else之前if-else值相同, 只是 pos = 2 现在,这将导致第二个分支执行:

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

在此将m2设置为已找到的最大值。 在第三次迭代中if-else执行if-else块中的第三个分支,该分支不会发生任何变化,因为您只需将值分配给循环变量。

如果两个第一个值是列表中的最大项目,则所有代码都会失败。 如果i大于当前m2但小于最大值,则只需进行最小的修改即可设置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

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

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

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

方式不使用只是排序和设置:

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

输出:

11

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM