Нахождение второго по величине элемента в массиве не работает должным образом - PullRequest
0 голосов
/ 19 февраля 2019

Моя программа для нахождения второго наименьшего числа работает, как и ожидалось, но при запуске кода для нахождения второго по величине числа вывод второго по величине неверен.Я выполнил вторую функцию аналогичным образом, но перевернул знак «больше, чем».Каков наилучший способ исправить код?

def second_smallest():
    num_list = [1,5,6,44,5,7,2,444,3]
    smallest_num = num_list[0]
    second_smallest_num = num_list[1]
    for i in num_list:
        if i < smallest_num:
            smallest_num = i
        elif smallest_num < i < second_smallest_num:
            second_smallest_num = i
    print("Smallest Number:", smallest_num)
    print("Second smallest number:", second_smallest_num)

def second_largest():
    num_list = [1,5,6,44,5,7,2,444,3]
    largest_num = num_list[0]
    second_largest_num = num_list[1]
    for i in num_list:
        if i > largest_num:
            largest_num = i
        elif second_largest_num < i < largest_num:
            second_largest_num = i
    print("Largest:", largest_num)
    print("Second largest:", second_largest_num)

Ответы [ 5 ]

0 голосов
/ 19 февраля 2019

Самый простой подход здесь - это просто использование встроенных в Python max() и min().Обратите внимание, что мы создаем копию входящего списка, так что на исходный файл num_list не влияет вывод remove():

num_list = [1,5,6,44,5,7,2,444,3]

def second_smallest(list):
    temp_num_list = list.copy()
    temp_num_list.remove(min(temp_num_list))
    smallest_num = min(list)
    second_smallest_num = min(temp_num_list)
    return smallest_num, second_smallest_num

def second_largest(list):
    temp_num_list = list.copy()
    temp_num_list.remove(max(temp_num_list))
    largest_num = max(list)
    second_largest_num = max(temp_num_list)
    return largest_num, second_largest_num

largest_num, second_largest_num = second_largest(num_list)
smallest_num, second_smallest_num = second_smallest(num_list)

print("Largest:", largest_num)
print("Second largest:", second_largest_num)

print("Smallest:", smallest_num)
print("Second smallest:", second_smallest_num)

:

Largest: 444
Second largest: 44
Smallest: 1
Second smallest: 2

Там нет необходимости делать какие-либо сравнения.Мы просто находим max и min, затем удаляем их из копии, а затем берем max и min из остатков.

Обратите внимание, что я абстрагировал num_list из функций, но оставив их в функциях будет работать.Этот подход позволяет вам повторно использовать функции с различными списками в вашем коде.

В качестве альтернативы, как упоминалось в другом ответе здесь, из @andercruzbr, вы можете импортировать модуль heapq и просто выполнить:

import heapq

num_list = [1,5,6,44,5,7,2,444,3]

def smallest_nums(list):
    return heapq.nsmallest(2, num_list)

def largest_nums(list):
    return heapq.nlargest(2, list)

print("Largest:", largest_nums(num_list)[0])
print("Second largest:", largest_nums(num_list)[1])

print("Smallest:", smallest_nums(num_list)[0])
print("Second smallest:", smallest_nums(num_list)[1])

Выход:

Largest: 444
Second largest: 44
Smallest: 1
Second smallest: 2
0 голосов
/ 19 февраля 2019

вверху, где вы объявляете

    num_list = [1,5,6,44,5,7,2,444,3]
    smallest_num = num_list[0]
    second_smallest_num = num_list[1]

Понимаете ли вы, что обращаетесь к нулю и первым элементам в списке, то есть

smallest_num = 1
second_smallest_num = 5

И, кстати, к нулюэлемент (то есть = 1) как раз оказывается самым маленьким элементом в этом списке, поэтому он работает для одной из функций, но не для другой.

То, что должно работать, это

def second_largest():
num_list = [1,5,6,44,5,7,2,444,3]
largest_num = max(num_list)
### SOME FUNCTION THAT TAKES IN THAT LIST, REMOVES THE LARGEST NUM ELEMENT, AND THEN FINDS AND RETURNS THE NEXT LARGEST ELEMENT - I'll leave this to you ##
for i in num_list:
    if i > largest_num:
        largest_num = i
    elif second_largest_num < i < largest_num:
        second_largest_num = i
print("Largest:", largest_num)
print("Second largest:", second_largest_num)
0 голосов
/ 19 февраля 2019

Когда вы назначаете новый самый высокий номер, вам нужно назначить второй самый высокий номер старому старшему числу.

def second_smallest():
     num_list = [1,5,6,44,5,7,2,444,3]
     smallest_num = num_list[0]
     second_smallest_num = num_list[1]
     for i in num_list:
         if i < smallest_num:
            smallest_num = i
         elif smallest_num < i < second_smallest_num:
         second_smallest_num = i
     print("Smallest Number:", smallest_num)
     print("Second smallest number:", second_smallest_num)

    def second_largest():
    num_list = [1,5,6,44,5,7,2,444,3]
    largest_num = num_list[0]
    second_largest_num = num_list[1]
    for i in num_list:
        if i > largest_num:
            second_largest_num = largest_num
            largest_num = i
        elif second_largest_num < i < largest_num:
            second_largest_num = i
    print("Largest:", largest_num)
    print("Second largest:", second_largest_num)

    second_smallest()
    second_largest()
0 голосов
/ 19 февраля 2019

Вы не установили переменную для хранения наибольшего значения.Это будет работать, если вы создадите переменную tmp для хранения наибольшего значения и назначите ее второму по величине впоследствии

def second_largest():
num_list = [1,5,6,44,5,7,2,444,3]
largest_num = num_list[0]
second_largest_num = num_list[1]
for i in num_list:
    if i > largest_num:
        tmp = largest_num
        largest_num = i
        second_largest_num = tmp
    elif second_largest_num < i < largest_num:
        second_largest_num = i
print("Largest:", largest_num)
print("Second largest:", second_largest_num)

Также, если будет лучше, если вы начнете итерацию с индекса 2массив в качестве первого и второго уже назначен.

0 голосов
/ 19 февраля 2019

Почему бы не использовать heapq?

>>> import heapq
>>> heapq.nlargest(2, num)
[10, 8]
>>> heapq.nsmallest(2, num)
[1, 2]
>>>

Подробнее о https://docs.python.org/2/library/heapq.html

...