3

私は学生名とマークが付いた辞書を持っています

dict1 = {'name1': 34, 'name2':45, 'name3': 98, 'name4':34, 'name5': 66}

上記の辞書から、上位 10 名の学生の名前とその成績を取得したいと考えています。

結果:

name3 98
name5 66
name2 45
name1 34
name4 34

同じ値の複数のキーの場合、キーはアルファベット順にする必要があります (例: name1 と name4 は、同じ値 34 に対してアルファベット順になります)

それを成し遂げる方法は?

4

2 に答える 2

7

素朴な解決策

これをプレーンな 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

@Martijn Pieters回答に触発されました

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 全体をソートする必要があります。

于 2013-05-15T17:36:20.927 に答える