2011-01-26 64 views
3

我有一个字典:如何按值排序字典并返回格式化字符串列表?

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

我想通过排序此字典的值(按降序排列)来创建格式化字符串列表。

即,我喜欢下面的列表:

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)) 

芹苴我仍然希望看到什么其他的解决方案也有可能一个更好。

回答

1

这是怎么回事?

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

我与这一个去因为我不t'必须导入'运算符' – Cuga 2011-01-26 05:25:18

+0

@Cuga:有关`string.format()`函数的更多信息,请参阅[PEP](http://www.python.org/dev/peps/pep-3101/) 。 – 2011-01-26 05:40:53

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

Ooo,我喜欢这一个 – Cuga 2011-01-26 04:29:45

0

还有一,codegolf风格:

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