问题出在这里
我有3个学生, 学生A,约翰19岁, 学生B,马克是16岁, 学生C,辛迪为17岁/ 0,
我想写一些代码,显示其中两个最古老的代码,即John,Cindy
到目前为止,我可以区分年龄了,但是我怎么知道这个名字 (这是我第二周学习python,所以我认为这对许多人来说应该很简单,但我无法理解)
student1 = {"name" : "John", "age" : 19}
student2 = {"name" : "Mark", "age" : 16}
student3 = {"name" : "Cindy", "age" : 17}
student_age = [student1["age"],student2["age"], student3["age"]]
student_age = sorted(student_age)
print (student_age[1:3])
答案 0 :(得分:2)
使用[sorted]函数1按年龄降序排列字典列表,并获得前两个值。
已排序的函数以相反的顺序reverse=True
进行排序,并以密钥年龄key=lambda x:x['age']
进行排序
students = [{"name" : "John", "age" : 19},
{"name" : "Mark", "age" : 16},
{"name" : "Cindy", "age" : 17}]
#Sort the elements by key age, in descending order
res = sorted(students, key=lambda x:x['age'], reverse=True)
#Get the first two elements of list
print(res[:2])
#[{'name': 'John', 'age': 19}, {'name': 'Cindy', 'age': 17}]
#Get the name and age of top two students
for item in res[:2]:
print(item['name'], item['age'])
John 19
Cindy 17
答案 1 :(得分:1)
@DeveshKumarSingh的答案是正确的,但是您无需对列表进行排序即可获得两个最大值。排序的时间复杂度为O(n lg n),而下面的代码是max
的变体,并且时间复杂度为O(n)。
>>> students = [
... {"name": "John", "age": 19},
... {"name": "Mark", "age": 16},
... {"name": "Cindy", "age": 17},
... {"name": "Jim", "age": 18},
... {"name": "Mary", "age": 15},
... {"name": "Josy", "age": 21},
... ]
首先,请两个前两个学生并按年龄递减的顺序排序:
>>> fst, snd = students[:2]
>>> if fst['age'] < snd['age']: fst, snd = snd, fst
他们,循环其余的学生,并在必要时更新大学生和第二大学生:
>>> for s in students[2:]:
... if s['age'] > fst['age']: fst, snd = s, fst
... elif s['age'] > snd['age']: snd = s
结果如下:
>>> fst, snd
({'name': 'Josy', 'age': 21}, {'name': 'John', 'age': 19})
为便于记录,该算法可以推广到具有优先级队列的k
个max元素。
与k
个第一名学生创建一个heap
:
>>> k = 3
>>> heap = [(s['age'], s) for s in students[:3]]
>>> import heapq
>>> heapq.heapify(heap)
对于每个学生,将学生添加到堆中,并删除堆中最小的学生。堆中始终包含k
个年龄较大的学生:
>>> for s in students[k:]:
... heapq.heappushpop(heap, (s['age'], s))
>>> [h[1] for h in sorted(heap, reverse=True)]
[{'name': 'Josy', 'age': 21}, {'name': 'John', 'age': 19}, {'name': 'Jim', 'age': 18}]
由于模块heapq
提供了功能nlargest
,因此您不必编写此代码:
>>> [h[1] for h in heapq.nlargest(k, [(s['age'], s) for s in students])]
[{'name': 'Josy', 'age': 21}, {'name': 'John', 'age': 19}, {'name': 'Jim', 'age': 18}]
文档指出:
({
nlargest
)对于n的较小值表现最佳。对于较大的值,使用sorted()函数更为有效。
实际上,时间复杂度为O(n lg k),可以通过将其与heap
的最小值进行比较来降低,然后再将值压入堆中(并整理学生名单以确保k
个大学生是均匀分布的。