5
2 3 6 6 5
5
Traceback (most recent call last):
File "solution.py", line 2, in <module>
li=[input() for i in range(n)]
File "solution.py", line 2, in <listcomp>
li=[input() for i in range(n)]
EOFError: EOF when reading a line
当我在pyCharm中编写此代码时,它可以正常工作,但是当我在Hackerrank.com中编写此代码时,它向我显示错误。
n = int(input())
li=[input() for i in range(n)]
mx = (max(li)) # it gives max number from list
li.remove(mx) # then i remove max no from the list
sec_mx = max(li) # now the second max is the new_max as you all knows
print(sec_mx)
答案 0 :(得分:2)
在列表中获得输入后,就可以使用冗长的内容:
scores = [2, 3, 6, 6, 5]
scores.sort(reverse = True)
max = scores[0]
second_best = scores[scores.count(max)]
print(second_best) #=> 5
答案 1 :(得分:1)
input
会一直读取,直到您换行。这适用于第一行,因为它是一个整数,后跟一个换行符,但不适用于第二行,因为分隔符现在是一个空格。在pyCharm中起作用的原因很可能是您用换行符分隔了输入内容,这与网站提供的内容相反。
您可能正在寻找更类似的东西
li = [int(x) for x in input().split()]
请注意,在有意义地调用列表上的int
之前,需要将所有元素都转换为max
。否则,您将需要对字符串进行字典编法比较,这将对多于一个数字的数字产生意外结果。
要注意的另一件事是list.remove
仅除去最大值的第一次出现。这意味着即使纠正了错误,您的代码也会产生6而不是5。
我可以想到多种解决方法:
li
。返回不等于li[0]
的第一个元素。在预先排序的列表上使用二等分:
from bisect import bisect_left
...
li.sort()
ind = bisect_left(li, li[-1]) - 1
second_max = li[ind]
答案 2 :(得分:0)
您只需对列表进行排序,就可以从最近的第二个索引(即-2)访问第二个最大的数字
li = [12, 45, 45, 2, 41, 31, 10, 8, 6, 4]
print(sorted(set(li))[-2])
OR
sorted_list = sorted(set(li), reverse=True)
print(sorted_list[1])