Найти минимальный элемент в словаре словарей - PullRequest
3 голосов
/ 22 февраля 2011

Мне нужно найти, какой элемент apple имеет минимальный size.

Tnx для всех ответов.Но есть одна проблема: я использую Python 2.4.2 (я не могу его изменить) и функция min не имеет key arg.Да, мне нужен ключ apple

apple = {1:{'size':12,'color':'red'},2:{'size':10,'color':'green'}}

Ответы [ 6 ]

12 голосов
/ 22 февраля 2011
import operator
min(apple.values(), key=operator.itemgetter('size'))

вернет вам

{'color': 'green', 'size': 10}

ОБНОВЛЕНИЕ: чтобы получить индекс:

min(apple, key=lambda k: apple[k]['size'])
10 голосов
/ 22 февраля 2011

В Python есть очень хороший параметр для функции min, который позволяет минимизировать произвольную функцию вместо простого сравнения элементов:

result = min(apple.values(), key=lambda x:x['size'])

Параметр key в большинстве случаев заменил более старую идиому декорации-процесса-декорации, которая могла бы применяться здесь:

result = min((x['size'], x) for x in apple.values())[1]

Если вместо этого вы хотите узнать номер (ключ) яблока (в вопросе неясно), то:

result = min(apple.keys(), key=lambda x:apples[x]['size'])

или (по старому стилю)

result = min((apples[x]['size'], x) for x in apple.keys())[1]
3 голосов
/ 22 февраля 2011

Используйте min с пользовательской функцией key, которая возвращает размер каждого элемента.

apple = {1:{'size':12,'color':'red'},2:{'size':10,'color':'green'}}
print min(apple.keys(), key=lambda k, a=apple: a[k]['size'])

Какие отпечатки:

2

P.S. Поскольку apple является коллекцией, я бы сделал ее множественной - apples.

1 голос
/ 22 февраля 2011
def get_min(apple):
    L = apple.values()
    m = L[0]
    for item in L:
        if item['size'] < m['size']:
            m = item
    return m

PS Не очень питонное, но линейное время

1 голос
/ 22 февраля 2011

Не знаю, самый ли это быстрый способ сделать это, но все равно:

>>> apple = [ {'size':12, 'color': 'red' }, { 'size':10, 'color':'green'} ]
>>> a = dict(map(lambda apple: (apple['size'], apple), apple))
>>> a
{10: {'color': 'green', 'size': 10}, 12: {'color': 'red', 'size': 12}}
>>> min = a[min(a.keys())]
>>> min
{'color': 'green', 'size': 10}
0 голосов
/ 15 марта 2011
min(map(lambda a:[apple[a]['size'],a], apple))[1]
...