Нахождение второго по величине элемента в списке (для дублированных элементов) - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь найти второй по величине элемент в массиве. Мой код работает для большинства входов, но для некоторых входов он терпит неудачу. Также, если я введу [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 ]

1 голос
/ 14 апреля 2019

Вот другой подход: преобразовать данные в набор (который, следовательно, удаляет дубликаты элементов), удалить максимум и распечатать тогдашний максимум. Например:

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]
1 голос
/ 14 апреля 2019

Ваша проблема начинается, когда первые 2 элемента равны 6. Таким образом, первый и второй максимум равны 6, поэтому он игнорирует 5.

Рекомендуется выбрасывать все повторяющиеся значения - для этого вы можете использовать встроенную функцию python (set). Затем попробуйте запустить код.

Второй подход будет инициировать первый максимум как первый элемент, а второй как -1, поэтому при первом обнаружении элемента больше, чем один из максимумов, он будет установлен. Если цикл завершен, а второй максимум все еще равен -1, это означает, что все элементы одинаковы

1 голос
/ 14 апреля 2019
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]
1 голос
/ 14 апреля 2019

Проблема заключается в инициализации первого и второго максимума, которые вы написали здесь

    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])

0 голосов
/ 14 апреля 2019

Вы можете попробовать использовать метод sorted для сортировки, а затем найти второй по величине элемент, преобразовав его в набор для удаления повторяющихся элементов, а затем выбрать последний второй элемент.

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

print(unique_arr[-2])

Edit:
Без использования функции python set или sorted:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...