Ключи диктовки, отсортированные по соответствующим значениям, лучше всего получить как
sorted(adict, key=adict.get, reverse=True)
поскольку вам нужны пары ключ / значение, вы можете работать с элементами, как предлагают все другие ответы, или (использовать изящный adict.get
связанный метод вместо itemgetters или странных лямбд; -),
[(k, adict[k]) for k in sorted(adict, key=adict.get, reverse=True)]
Редактировать : с точки зрения производительности в этом нет особого смысла:
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6))' '[(k, adict[k]) for k in sorted(adict, key=adict.get, reverse=True)]'
100000 loops, best of 3: 10.8 usec per loop
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6)); from operator import itemgetter' 'sorted(adict.iteritems(), key=itemgetter(1), reverse=True)'
100000 loops, best of 3: 9.66 usec per loop
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6))' 'sorted(adict.iteritems(), key=lambda (k,v): v, reverse=True)'
100000 loops, best of 3: 11.5 usec per loop
Итак, решение на основе .get
на полпути по производительности между двумя items
- немного медленнее, чем itemgetter
, немного быстрее, чем lambda
. В случаях «узкого места», когда эти микросекундные дроби имеют решающее значение для вас, непременно сосредоточьтесь на этом. В обычных случаях, когда эта операция - только один шаг в какой-то более крупной задаче, а микросекунда более или менее не имеет большого значения, сосредоточение на простоте идиомы get
также является разумной альтернативой.