Найти наименьший индекс max во вложенном цикле с ключом строго в 0-м индексе - PullRequest
1 голос
/ 14 апреля 2019

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

Пример:

my_list = [[1, 2], [2, 3], [2, 7]]
print(max(my_list))

Вывод:

[2, 7]

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

Прямо сейчас, вот что я делаю для достижения своей цели, и это не выглядит как самый эффективный способ сделать это.

my_list = [[1, 2], [2, 3], [2, 7]]
maximum_val = max(my_list)[0]
for item in my_list:
    if item[0] == maximum_val:
        print(my_list.index(item))
        break

Вывод:

1

Может ли кто-нибудь любезно дать более оптимизированную по времени форму того, что делает мой текущий код, без импорта внешних библиотек?

1 Ответ

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

Вы просите max() найти самый большой список , а [2, 7] больше [2, 3], поскольку списки упорядочены лексикографически .

Не сравнивайте списки.Используйте функцию key для выбора первого целого числа:

max(my_list, key=lambda nested: nested[0])

Возвращает элемент из my_list, для которого значение, возвращаемое функцией key, является максимальным.В случае нескольких элементов с одинаковым максимумом возвращается первый такой элемент:

>>> my_list = [[1, 2], [2, 3], [2, 7]]
>>> max(my_list, key=lambda nested: nested[0])
[2, 3]

Далее, чтобы получить index этого элемента, передайте индексы в max(),и функция key отображает эти индексы на сравниваемое значение:

max(range(len(my_list)), key=lambda idx: my_list[idx][0])

Таким образом, для этого требуется последовательность целых чисел от 0 до (но не включая) длины вашего списка my_list,затем использует функцию key, чтобы вернуть первое целое число элемента с этим индексом в списке my_list:

>>> my_list = [[1, 2], [2, 3], [2, 7]]
>>> max(range(len(my_list)), key=lambda idx: my_list[idx][0])
1
...