Как найти наибольшее число (я) в списке элементов, возможно, не уникальных?

Вот моя программа,

item_no = []
max_no = 0
for i in range(5):
    input_no = int(input("Enter an item number: "))
    item_no.append(input_no)
for no in item_no:
    if no > max_no:
       max_no = no
high = item_no.index(max_no)
print (item_no[high])

Пример ввода: [5, 6, 7, 8, 8]

Пример вывода: 8

Как я могу изменить свою программу для вывода одинаковых старших чисел в массиве?

Ожидаемый результат: [8, 8]

Ответ 1

Просто получите максимальное значение, используя max а затем его count и объедините их в список-понимание.

item_no = [5, 6, 7, 8, 8]

max_no = max(item_no)
highest = [max_no for _ in range(item_no.count(max_no))]
print(highest)  # -> [8, 8]

Обратите внимание, что это вернет список одного элемента в случае, если ваше максимальное значение появляется только один раз.


Решение, более близкое к вашему текущему стилю программирования, будет следующим:

item_no = [5, 6, 7, 8, 8]
max_no = 0  # Note 1 
for i in item_no:
    if i > max_no:
        max_no = i
        high = [i]
    elif i == max_no:
        high.append(i)

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

Заметки

  1. Я предполагаю, что вы имеете дело только с N * (1, 2,...) числами. Если это не так, следует использовать инициализацию с помощью -math.inf.

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

Ответ 2

Вы можете сделать это еще короче:

item_no = [5, 6, 7, 8, 8]
#compute once - use many
max_item = max(item_no)
print(item_no.count(max_item) * [max_item])

Выход:

[8, 8]

Ответ 3

Вы могли бы использовать list для этой задачи следующим образом:

numbers = [5, 6, 7, 8, 8]
maxnumbers = [i for i in numbers if i==max(numbers)]
print(*maxnumbers,sep=',')

выход:

8,8

* Оператор в print используются для распаковки значений, sep используются для информирования print, что Seperator использовать: , в этом случае.

РЕДАКТИРОВАТЬ: Если вы хотите получить индексы с наибольшим значением и вызывать max только один раз, выполните:

numbers = [5, 6, 7, 8, 8]
biggest = max(numbers)
positions = [inx for inx,i in enumerate(numbers) if i==biggest]
print(*positions,sep=',')

Выход:

3,4

Как вы можете проверить, numbers[3] равны biggest а numbers[4] равны biggest.

Ответ 4

  1. Посчитайте появление максимального числа

  2. переберите список, чтобы вывести максимальное число для диапазона счета (1)

Отсюда:

item_no = [5, 6, 7, 8, 8]
counter = item_no.count(max(item_no))      # 2
print([max(item_no) for x in range(counter)])   

ВЫХОД:

[8, 8]

Ответ 5

Эта проблема может быть решена в одной строке путем нахождения элемента, который равен максимальному значению: для улучшения производительности сохраните max в var Mvalue = max (item_no) [i for я in item_no if i==Mvalue]

Ответ 6

Я думаю, что было бы лучше, если бы мы оценили max в массиве и его count за одну итерацию

def maxs(iterable):
    max = None
    count = 0
    for index, value in enumerate(iterable):
        if index == 0 or value >= max:
            if value != max:
                count = 0
            max = value
            count += 1
    return count * [max]


print (maxs([5, 6, 7, 8, 8]))   # [8, 8]
print (maxs([3, 2, 4, 5, 1, 2, 4, 5, 2, 5, 0])) # [5, 5, 5]
print (maxs([])) # []

Попробуйте!