在列表中查找第二个最大数字

时间:2015-05-21 19:09:58

标签: python

第一行包含N.第二行包含N个整数的列表,每个整数用空格分隔。我需要找到列表中的第二大数字。

我的代码:

N = int(raw_input())
L = map(int, raw_input().split())

for i in L:
    if i == max(L):
        L.remove(i)
print L
print max(L)

如果输入为[2,6,9,9,5],则仍然会打印最大值:9,因为只有一个9从列表中删除。

那么,如何删除列表中的所有第一个最大值?

谢谢

6 个答案:

答案 0 :(得分:5)

N = 5
L = map(int, "2 6 9 9 5".split())

maxL = max(L)
#list comprehension for remove all occurrences of max(L)
L_filter = [e for e in L if e!=maxL]
print L
#print max of L_filter, second maximum of L
print max(L_filter)

你得到:

[2, 6, 9, 9, 5]
6

答案 1 :(得分:4)

它仍然返回9的原因是因为您在迭代它时会改变列表。基本上步骤是:

1.    2  6  9  9  5
      ^idx0
2.    2  6  9  9  5
         ^idx1
3.    2  6  9  9  5
            ^idx2
  3a. 2  6  9  5
            ^idx2
4.    2  6  9  5
               ^

当它删除前9个时,看看它如何跳过评估第二个9?您会注意到您的列表是[2, 6, 9, 5, 9],它是否正常运行。

使代码运行的最小变化是迭代列表的副本,而不是列表本身。

L = [2, 6, 9, 9, 5]

maxL = max(L)  # gotta move this out!!
for i in L[:]:  # the slice creates a copy
    if i == maxL:
        L.remove(i)

print(max(L))

然而,制作一个集合(确保唯一性),排序并返回倒数第二个条目可能更容易。

second_max = sorted(set(L))[-2]

答案 2 :(得分:4)

通过转换为集合来删除重复的元素:

values = set(L)

然后删除最大值:

values.discard(max(values))

答案 3 :(得分:0)

你也可以这样做

L = [2, 6, 9, 9, 5]
L_tuples = zip(L, range(len(L))) #need tuples to make a dict
L_map = dict(L_tuples)           #use the dict to dedupe
L_uniq = L_map.keys()            #get back deduped values
L_sorted = sorted(L_uniq)        #sort them ascending
second_largest = L_sorted[-2]    #second from last is second largest

#or, rolling all that up...
second_largest = sorted(dict(zip(L, range(len(L)))).keys())[-2]

答案 4 :(得分:0)

>>> import heapq
>>> values = [2, 6, 9, 9, 5]
>>> heapq.heapify(values)
>>> heapq._heapify_max(values)
>>> value = top = heapq.heappop()
>>> while value == top:
...     value = heapq.heappop()
>>> print value

答案 5 :(得分:0)

这是计算列表中第二个最大值的另一种方法。该代码还考虑了在列表中包含重复元素的情况。

number_of_elements=int(input('The number of elements in list\n'))

a=[]
for i in range(number_of_elements):
    a.append(int(input('enter the list elements')))


#Use built-in function to calculate the maximum

max_list=max(a)

print("The maximum element is ",max_list)

#Calculate the number of times the number occur

count_of_max_num=a.count(max_list)

b=a

if (count_of_max_num == 1):

    b.remove(max_list)
    second_max=max(b)
    print("The second largest number is", second_max, "The new list is" ,b)
else:
    for i in range(count_of_max_num):
        b.remove(max_list)
    print ("The second largest is" , max(b))