第一行包含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从列表中删除。
那么,如何删除列表中的所有第一个最大值?
谢谢
答案 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))