python,将字典按值排序为列表而非按键
我有一个叫做collections.defaultdict(int)的东西,用来统计某个键在一组数据中出现的次数。之后我想把这些数据排序,当然是先把它变成一个列表,然后按从大到小的顺序排列,也就是把出现次数最多的放在前面。我是这样创建我的字典的:
adict = defaultdict(int)
之后我做了一些:
adict['someval'] += 1
adict['anotherval'] +=1
adict['someval'] += 1
理想情况下,我想得到的输出是:
someval => 2
anotherval => 1
7 个回答
7
只需要按照值对结果字典进行排序:
for k, v in sorted(adict.items(), key=lambda kv: kv[1], reverse=True):
print("%s => %s" % (k,v))
43
要对字典进行排序:
from operator import itemgetter
sorted(adict.iteritems(), key=itemgetter(1), reverse=True)
48
要获取一个字典的键,并按照对应的值从大到小排序,最简单的方法是:
sorted(adict, key=adict.get, reverse=True)
因为你需要键值对,所以可以像其他答案所说的那样处理字典的项,或者(为了使用方便的 adict.get
方法,而不是使用项获取器或奇怪的 lambda 表达式;-),
[(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
方法的简单性也是一个合理的选择。