我知道这个问题有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.
答案 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