素朴な解決策
これをプレーンな python で書くことができます:
>>> 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)]
sorted
比較として並べ替えのキーを取ります
次に、必要に応じてそれらを印刷します。
>>> for name, score in sorted_names:
... print name, score
...
name3 98
name5 66
name2 45
name1 34
name4 34
または、一度にすべてを実行します。
>>> 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
heapq
特にを使用すると、heapq.nsmallest
より洗練されたソリューションを実現できます。
>>> 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
このソリューションで私が気に入っているのは、nsmallest
インテリジェントに実装できることです。これは、 Lazy Evaluation and Time Complexityに対するこの回答で説明されているような遅延実装のようなものである可能性があります。そのため、最低限の作業のみを行います。一方、単純なソリューションでは、最初の 10 個を取得する前に iterable 全体をソートする必要があります。