我有一个collections.defaultdict(int),我正在构建它来计算一个键出现在一组数据中的次数.我后来希望能够以递减的方式对它进行排序(显然首先将其转换为列表),先按最高值排序.我创建了如下字典:
adict = defaultdict(int)
Run Code Online (Sandbox Code Playgroud)
后来我做了一堆:
adict['someval'] += 1
adict['anotherval'] +=1
adict['someval'] += 1
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要打印出来:
someval => 2
anotherval => 1
Run Code Online (Sandbox Code Playgroud)
Nad*_*mli 42
要获得字典排序:
from operator import itemgetter
sorted(adict.iteritems(), key=itemgetter(1), reverse=True)
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 38
一个字典的键,按相应的值反向排序,最好得到
sorted(adict, key=adict.get, reverse=True)
Run Code Online (Sandbox Code Playgroud)
因为你想要键/值对,你可以像所有其他答案所建议的那样处理项目,或者(使用漂亮的adict.get绑定方法而不是项目符号或怪异的lambdas ;-),
[(k, adict[k]) for k in sorted(adict, key=adict.get, reverse=True)]
Run Code Online (Sandbox Code Playgroud)
编辑:就性能而言,无论是哪种方式都没有:
$ 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
Run Code Online (Sandbox Code Playgroud)
因此,.get基于两者的解决方案在性能方面处于items中等水平 - 稍微慢一点itemgetter,略快于lambda.在"瓶颈"情况下,那些微秒级分对你来说至关重要,无论如何都要关注它.在正常情况下,这个操作只是在一个更大的任务中只有一个步骤而一个微秒或多或少的事情很少,因此,关注简洁的get习语也是一个合理的选择.
只需按值对结果字典进行排序:
for k, v in sorted(adict.items(), key=lambda kv: kv[1], reverse=True):
print("%s => %s" % (k,v))
Run Code Online (Sandbox Code Playgroud)