Как отсортировать dict по значениям и вернуть список отформатированных строк? - PullRequest
3 голосов
/ 26 января 2011

У меня есть dict:

text_to_count = { "text1": 1, "text2":0, "text3":2}

Я бы хотел создать список отформатированных строк, отсортировав значения этого dict (в порядке убывания).

Т.е. якак следующий список:

result = ["2 - text3", "1 - text1", "0 - text2"]

Любые идеи?

Редактировать:

В ожидании ответов я продолжал взламывать его и придумал:

result = map(lambda x: "{!s} - {!s}".format(x[1], x[0]), 
                       sorted(text_to_count.iteritems(), 
                       key = lambda(k, v): (v, k), reverse=True ))

То есть мне все еще интересно посмотреть, какие еще есть решения, возможно, одно лучшее.

Ответы [ 3 ]

2 голосов
/ 26 января 2011
['%d - %s' % (v, k) for (k, v) in sorted(text_to_count.iteritems(),
    key=operator.itemgetter(1), reverse=True)]
1 голос
/ 26 января 2011

Как это?

result = ['{1} - {0}'.format(*pair) for pair in sorted(text_to_count.iteritems(), key = lambda (_,v): v, reverse = True)]
0 голосов
/ 26 января 2011

И еще один стиль кодегольфа:

>>> ['%s - %s'%(t[x],x) for x in sorted(t,key=t.get)[::-1]]
['2 - text3', '1 - text1', '0 - text2']

PS.чтобы проиллюстрировать точку зрения, высказанную Игнасио Васкесом-Абрамсом, обратите внимание, как результаты сортировки могут отличаться при наличии повторений значений:

>>> t={'txt1':1, 'txt2':0, 'txt3':1}
>>> ['%s - %s'%(t[x],x) for x in sorted(t,key=t.get)[::-1]]

['1 - txt3 ', '1 - txt1 ',' 0 - txt2 ']

>>> ['%s - %s'%(t[x],x) for x in sorted(t,key=t.get,reverse=True)]

[' 1 - txt1 ',' 1 - txt3 ','0 - txt2 ']

...