Список диктонов Python, индекс максимального значения

Я пытаюсь получить индекс словаря с максимальным значением 'size' в списке словарей, подобных следующему:

ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}]

со следующим кодом я могу взять максимальный размер:

items = [x['size'] for x in ld]
print(max(items))

Как я могу взять его индекс сейчас? Есть ли простой способ?

Тест:

Я просто решил, что смогу сделать это:

items = [x['size'] for x in ld]
max_val = max(items)
print(items.index(max_val))

это правильно?

Ответ 1

Скажите max(), как рассчитать максимум для последовательности индексов:

max(range(len(ld)), key=lambda index: ld[index]['size'])

Это вернет индекс, для которого клавиша size является самой высокой:

>>> ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}]
>>> max(range(len(ld)), key=lambda index: ld[index]['size'])
1
>>> ld[1]
{'size': 200, 'prop': 'boo'}

Если вы все время хотели этот словарь, вы можете просто использовать:

max(ld, key=lambda d: d['size'])

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

max(enumerate(ld), key=lambda item: item[1]['size'])

Еще немного демо:

>>> max(ld, key=lambda d: d['size'])
{'size': 200, 'prop': 'boo'}
>>> max(enumerate(ld), key=lambda item: item[1]['size'])
(1, {'size': 200, 'prop': 'boo'})

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

Использование отдельного списка для извлечения всех значений size, а затем сопоставление его с исходным списком не очень эффективно (теперь вам нужно выполнить итерации по списку дважды). list.index() не может работать, поскольку он должен соответствовать всему словарю, а не только одному значению в нем.

Ответ 2

Вы можете передать функцию enumerate(ld) в max с помощью правильной клавиши:

>>> max(enumerate(ld),key=lambda arg:arg[1]['size'])[0]
1

Если вам нужен словарь с максимальным значением size, то в качестве Pythonic-подхода вы можете использовать функцию operator.itemgetter в качестве ключа:

In [10]: from operator import itemgetter 

In [11]: ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}]

In [12]: fn = itemgetter('size')

In [13]: max(ld, key=fn)
Out[13]: {'prop': 'boo', 'size': 200}