2011-01-26 2 views
3

У меня Dict:Как сортировать dict по значениям и возвращать список форматированных строк?

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

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

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

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

Любые идеи?

Edit:

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

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

Тхо Я по-прежнему заинтересованы в том, что другие решения есть, возможно, один лучше.

ответ

1

Как это?

result = ['{1} - {0}'.format(*pair) for pair in sorted(text_to_count.iteritems(), key = lambda (_,v): v, reverse = True)] 
+0

Я пошел с этим, так как я не' t необходимо импортировать «operator» – Cuga

+0

@Cuga: для дальнейшего ознакомления с функцией 'string.format()' см. [PEP] (http://www.python.org/dev/peps/pep-3101/) , –

2
['%d - %s' % (v, k) for (k, v) in sorted(text_to_count.iteritems(), 
    key=operator.itemgetter(1), reverse=True)] 
+0

Ооо, мне нравится этот – Cuga

+0

Ба, снова поднятый вверх. : P –

+0

@Jeff, у вас все еще хорошо - вы научили меня .format (* ... Я раньше этого не видел. Есть ли сравнение скорости? – Cuga

0

И еще один, codegolf стиль:

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

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

>>> 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']

+0

Обратите внимание, что реверсирование после сортировки может не иметь одинакового результата как реверсирование * в то время как * сортировка, поскольку сортировка Python стабильна. –

+0

@Ignacio Vazquez-Abrams: спасибо за примечание, было забавно немного подумать над этим. Я согласен - реверсирование результата сортировки не обязательно будет возвращать тот же результат, что и 'reverse = True' для случая, когда имеется несколько значений одного и того же типа, но он хорошо удовлетворяет вопрос (нет требования определенного порядка, когда значения одинаковы). –

Смежные вопросы