Печать дикта, отсортированного по значениям

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

dictIterator = iter(sorted(bigramDict.iteritems()))
for ngram, value in dictIterator:
    print("There are " + str(value) + " " + ngram)

Осмотрев вышеописанный код, я предположил, что он сделает итератор, который возвращает пары ключ/значение в порядке от самого большого до наименьшего, но это не так.

Кто-нибудь может понять, в чем проблема? или другой способ сделать это?

Ответ 1

Можно использовать тот факт, что сортировка работает с кортежами, рассматривая первый элемент как более важный, чем второй и т.д.:

d = { "a":4, "c":3, "b":12 }
d_view = [ (v,k) for k,v in d.iteritems() ]
d_view.sort(reverse=True) # natively sort tuples by first element
for v,k in d_view:
    print "%s: %d" % (k,v)

Вывод:

b: 12
a: 4
c: 3

EDIT: однострочное выражение, выражение генератора:

sorted( ((v,k) for k,v in d.iteritems()), reverse=True)

Вывод:

[(12, 'b'), (4, 'a'), (3, 'c')]

Ответ 2

Вы можете использовать параметр key sorted для сортировки по второму элементу:

>>> d = { "a":4, "c":3, "b":12 }
>>> from operator import itemgetter
>>> for k, v in sorted(d.items(), key=itemgetter(1)):
    print k, v


c 3
a 4
b 12
>>> 

Ответ 3

>>> d = { "a":4, "c":3, "b":12 }
>>> from operator import itemgetter
>>> lst = sorted(d.iteritems(), key=itemgetter(1))
>>> for t in lst: print '%s : %d' % (t[0], t[1])
... 
c : 3
a : 4
b : 12

Ответ 4

d = { "a":4, "c":3, "b":12 }
for v in sorted( d.values() ):
    for key in d:
        if d[ key ] == v:
            print key, v
            break