Найдите 3 максимальных элемента списка с python - PullRequest
0 голосов
/ 13 февраля 2020

Как я могу найти три максимальных элемента списка и заменить их по одному индексу с его результатом при делении на 2.

Пожалуйста, что я делаю не так:

ввод : 2 5 8 19 1 15 7 20 11
вывод должен быть: 2 5 8 9.5 1 7.5 7 10 11

Индекс, выходящий за пределы диапазона, является отображаемым результатом

def numberInput(line):
  lineInput = [int(i) for i in line.split()]

  min1 = min(lineInput)

  for j in range(len(lineInput)):

     if lineInput[j]>min1 and lineInput[j] > lineInput[j+1]:

           max1 = lineInput[j]/float(2)
     else:
           max1 = lineInput[j]/float(2)
           lineInput[j] = max1

     lineInput[j] = max1
  return(lineInput)

number = '2 5 8 19 1 15 7 20 11' 
print(numberInput(number))

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Если порядок списка не важен, вы можете просто отсортировать список по убыванию, а затем заменить первые 3 элемента на

a = [2, 5, 8, 19, 1, 15, 7, 20, 11]
a.sort(reverse = True)
a[0] = a[0] / 2
a[1] = a[1] / 2
a[2] = a[2] / 2

Вывод

[10.0, 9.5, 7.5, 11, 8, 7, 5, 2, 1]

Если порядок важен,

import heapq
largest = heapq.nlargest(3, a)
for i in range(len(a)):
    if a[i] in largest:
        a[i] = a[i] / 2    

Выход

[2, 5, 8, 9.5, 1, 7.5, 7, 10.0, 11]

heapq.nlargest() - это функция heapq, которая может дать n наибольшее номера из списка. Поскольку списки в Python не имеют функции замены, список необходимо было просмотреть один раз, а затем заменить вручную. Надеюсь, что это решит вашу проблему.

0 голосов
/ 13 февраля 2020

Почему бы вам просто не пройтись по списку один раз (возможно, он немного длиннее кода, но определенно эффективен)

def numberInput(line):
    lineInput = [int(i) for i in line.split()]
    n = len(lineInput)
    if n <= 3:
        return [i / 2 for i in lineInput]
    max_pairs = [(lineInput[i], i) for i in range(3)] # keep track of 3 max's and their indices
    max_pairs.sort(key = lambda x: -x) # sort in descending order
    for i in range(3, n):
        if lineInput[i] >= max_pairs[0][0]: # greater than the largest element
            max_pairs = [(lineInput[i], i)] + max_pairs[:2]
        elif lineInput[i] >= max_pairs[1][0]: # greater than second element
            max_pairs = [max_pairs[0], (lineInput[i], i), max_pairs[1]]
        elif lineInput[i] >= max_pairs[2][0]: # greater than third element
            max_pairs = max_pairs[:2] + [(lineInput[i], i)]
     for pair in max_pairs:
         lineInput[pair[1]] = lineInput[pair[0]] / 2
     return lineInput

Объяснение: max_pairs - это набор три кортежа, содержащие максимум три элемента и их индексы

Примечание: Я думаю, что вышесказанное проще всего понять, но вы можете сделать это в al oop, если вам не нравится все эти ifs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...