在列表中查找第二大元素(对于重复的元素)

时间:2019-04-14 15:04:24

标签: python algorithm logic

我试图在数组中找到第二大元素。我的代码可用于大多数输入,但对于某些输入,则失败。 另外,如果我输入[6, 6, 6, 5],则程序应输出5作为第二大而不是6。

对于[6,6,6,6,6,6,6,6,6,5],它打印的是6而不是5。 对于重复元素,它给出错误的结果。

# Given the participants' score sheet for your University Sports Day, you are required to find the runner-up score.
# You are given scores. Store them in a list and find the score of the runner-up.


if __name__ == '__main__':
    n = int(input("Enter the total numbers: "))
    arr = list(map(int, input("Enter the numbers: ").split()))
    if arr[0] >= arr[1]:
        first_max = arr[0]
        second_max = arr[1]
    else:
        first_max = arr[1]
        second_max = arr[0]
    for i in range(2, n):
        if arr[i] > first_max:
            second_max = first_max
            first_max = arr[i]
        elif arr[i] > second_max and arr[i] != first_max:
            second_max = arr[i]

    print(second_max)

请有人解释其背后的逻辑。

5 个答案:

答案 0 :(得分:1)

问题在于您在此处编写的第一个和第二个max的初始化

    if arr[0] >= arr[1]:
    first_max = arr[0]
    second_max = arr[1]
else:
    first_max = arr[1]
    second_max = arr[0]

[6,6,6,6,6,6,6,6,6,5]的情况下,您的first_max和second_max都等于6,并且在给定5时不能更改,因为第二个最大值仍大于5。

一种解决方案是编辑部分代码

之前

elif arr[i] > second_max and arr[i] != first_max: second_max = arr[i]

之后

elif first_max == second_max or (arr[i] > second_max and arr[i] != first_max: second_max = arr[i])

答案 1 :(得分:1)

def second_biggest(l):
  """ Get second biggest entry in a list

    1. make a `set` out of `list`: guarantees that every entry only appears once
    2. sort the `set` by value
    3. get the second biggest entry
  """
  return sorted(set(l))[-2]

答案 2 :(得分:1)

您的问题从前2个元素为6开始。因此,第一个和第二个最大值均为6,因此忽略了5。

最佳做法是抛出所有重复值-您可以使用python内置函数来这样做(set)。然后尝试运行您的代码。

第二种方法是将第一个最大值设为第一个元素,将第二个最大值设为-1 ,因此,第一次遇到较大的元素时,将设置其中一个最大值。如果循环结束并且第二个最大值仍为-1,则表示所有元素都相同

答案 3 :(得分:1)

这是另一种方法:将数据转换为一个集合(因此删除重复的元素),删除最大值,然后打印then-maximum。例如:

data = [6,6,6,6,6,6,6,6,6,5]
sb = set(data) # remove duplicate elements
sb.remove(max(sb)) # remove the max element
print(max(sb)) # print the new max

输出:

5

如果您只想删除重复的元素,请将集合转换回列表:

data = [6,6,6,6,6,6,6,6,6,5]
data = list(set(data))

输出:

>>> data
[5, 6]

答案 4 :(得分:0)

您可以尝试使用sorted方法进行排序,然后通过转换为set来查找第二大元素,以删除重复的元素,然后选择倒数第二个元素。

arr = [2, 4, 5, 5, 455, 34]
unique_arr = sorted(set(arr))

print(unique_arr[-2])

修改:
不使用python setsorted函数:

arr = [1, 4, 5, 723, 64, 76, 34]

max_1 = max(arr)
max_2 = min(arr)

for item in arr:
    if item > max_2 and item != max_1:
        max_2 = item

print("Second largest item: ", max_2)