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

Например:

a = [1,2,7,9,3,4]

Пожеланная выходная мощность:

maxVal = 9
secondMax = 7 

index_max = 3
index_secondMax = 2

Есть ли у кого-нибудь предложения о том, как подойти к этому, похоже, не может найти способ сделать это.

0
J French 1 Июн 2020 в 15:14

6 ответов

Лучший ответ

Используйте sorted и list.index:

MaxVal, secondMax = sorted(a)[-2:]
index_max = a.index(MaxVal)
index_secondMax = a.index(secondMax)
4
jfaccioni 1 Июн 2020 в 12:20
secondMax, Max  = sorted(a)[-2:]
index_max = a.index(Max)
index_secondMax = a.index(secondMax)
1
Amandeep Singh 1 Июн 2020 в 12:24

Numpy - настоящий бог для таких вещей

import numpy as np

a = [1,2,7,9,3,4]

b = np.sort([(v, i) for i, v in enumerate(a)])

maxVal = b[-1, 0]
index_max = b[-1, 1]

secondMax = b[-2, 0]
index_sec_max = b[-2, 1]

print(maxVal)
print(secondMax)

print(index_max)
print(index_sec_max)
1
Aramakus 1 Июн 2020 в 12:34
import numpy as np
a = [1,2,7,9,3,4]
max_value = np.sort(a)[-1]
max_value2 = np.sort(a)[-2]
int(np.squeeze(np.where(a == max_value))),int(np.squeeze(np.where(a == max_value2)))
2
Ashok Krishna 1 Июн 2020 в 12:21

Вы можете использовать enumerate, чтобы связать значения с их индексами, отсортировать по второму значению (значение, а не его индекс) и сохранить последние

from operator import itemgetter
a = [1,2,7,9,3,4]
res = list(sorted(enumerate(a), key=itemgetter(1)))[-2:]

print(res) # [(2, 7), (3, 9)]
print("1st Max", res[-1][1], "at", res[-1][0])  # 1st Max 9 at 3
print("2nd Max", res[-2][1], "at", res[-2][0])  # 2nd Max 7 at 2
2
azro 1 Июн 2020 в 12:24

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

a = [1,2,7,9,3,4]
index_max, maxVal = max(enumerate(a), key=lambda x:x[1])
index_secondMax, secondMax =  max([t for t in enumerate(a) if t[0] != index_max],  key=lambda x:x[1])
2
Błotosmętek 1 Июн 2020 в 12:26