<h2>天真的解决方案</h2>
<p>您可以用纯python编写:</p>
<pre><code>>>> names = {'name1': 34, 'name2':45, 'name3': 98, 'name4':34, 'name5': 66}
>>> sorted_names = sorted(names.iteritems(), key=lambda (k, v): (-v, k))[:10]
>>> sorted_names
[('name3', 98), ('name5', 66), ('name2', 45), ('name1', 34), ('name4', 34)]
</code></pre>
<p><a href="http://docs.python.org/2/library/functions.html#sorted" rel="nofollow noreferrer">^{<cd1>}</a>以排序键作为比较</p>
<p>然后按你的意愿打印出来:</p>
<pre><code>>>> for name, score in sorted_names:
... print name, score
...
name3 98
name5 66
name2 45
name1 34
name4 34
</code></pre>
<p>或者一次就做完:</p>
<pre><code>>>> for name, score in sorted(names.iteritems(), key=lambda (k, v): (-v, k))[:10]:
... print name, score
...
name3 98
name5 66
name2 45
name1 34
name4 34
</code></pre>
<h2>灵感来自<a href="https://stackoverflow.com/users/100297/martijn-pieters">@Martijn Pieters</a>'<a href="https://stackoverflow.com/a/16571448/1549047">answer</a></h2>
<p>使用<a href="http://docs.python.org/2/library/heapq.html" rel="nofollow noreferrer">^{<cd2>}</a>,特别是<a href="http://docs.python.org/2/library/heapq.html#heapq.nsmallest" rel="nofollow noreferrer">^{<cd3>}</a>,您可以得到一个更优雅的解决方案:</p>
<pre><code>>>> from heapq import nsmallest
>>> for name, score in nsmallest(10, names.iteritems(), key=lambda (k, v): (-v, k)):
... print name, score
...
name3 98
name5 66
name2 45
name1 34
name4 34
</code></pre>
<p>我喜欢这个解决方案的地方是<a href="http://docs.python.org/2/library/heapq.html#heapq.nsmallest" rel="nofollow noreferrer">^{<cd4>}</a>可以智能地实现。它可能类似于一个懒惰的实现,如在对<a href="https://stackoverflow.com/a/12057921/1549047">Lazy Evaluation and Time Complexity</a>的回答中所描述的。所以,你只能做最少的工作。而朴素的解决方案在得到前10个iterable之前必须对整个iterable进行排序。</p>