如何使用Python dict获得班上前10名学生

如何使用Python dict获得班上前10名学生,python,dictionary,Python,Dictionary,我有一本有学生姓名和分数的字典 dict1 = {'name1': 34, 'name2':45, 'name3': 98, 'name4':34, 'name5': 66} 我想从上面的格言中得到前十名学生的名字以及他们的分数 结果: name3 98 name5 66 name2 45 name1 34 name4 34 对于相同值的多个键,键必须按字母顺序排列(例如:对于相同值34,名称1和名称4按字母顺序排列) 如何完成它?使用: 演示: 请注意,由于示例字典小于所需的顶部n,因此您

我有一本有学生姓名和分数的字典

dict1 = {'name1': 34, 'name2':45, 'name3': 98, 'name4':34, 'name5': 66}
我想从上面的格言中得到前十名学生的名字以及他们的分数

结果:

name3 98
name5 66
name2 45
name1 34
name4 34
对于相同值的多个键,键必须按字母顺序排列(例如:对于相同值34,名称1和名称4按字母顺序排列)

如何完成它?

使用:

演示:

请注意,由于示例字典小于所需的顶部
n
,因此您也可以使用
sorted()

但是对于任何顶部
n
,其中
n
小于
len(字典)
heapq
是更好的选择

或者,使用一个
collections.Counter()
对象,它有一个
。最常见的()
方法,可以精确地给出该方法;计数器中得分最高的
n
元素:

>>> scores = Counter(dictionary)
>>> scores
Counter({'name3': 98, 'name5': 66, 'name2': 45, 'name4': 34, 'name1': 34})
>>> scores.most_common(3)
[('name3', 98), ('name5', 66), ('name2', 45)]
原始解决方案 您可以用普通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)]
将用于排序的键作为比较

然后按您的意愿打印:

>>> 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
灵感来自 使用,尤其是,您可以获得更优雅的解决方案:

>>> 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

我喜欢这个解决方案,因为它可以智能地实现。它可能是一个懒惰的实现,如本文的答案中所述。所以,你只需要做最少量的工作。而最简单的解决方案是在得到前10个变量之前对整个iterable进行排序。

不要给变量命名
dict
;它隐藏了内置类型。我想说给他们比萨饼和啤酒:)-1,因为他们没有尝试。你可以使用
reverse=True
而不是否定分数。joneshf,一切看起来都很好。但是最后两个名字应该按字母顺序排列,即name134和name434,而不是name434和name134@Kranti更新后,您还应该更新您的问题以包括该情况。不幸的是,这就去掉了reverse=True,但不管怎样。让
heapq
按排序顺序返回相同分数的名字真是太好了!
>>> 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
>>> 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