从列表中找到2个大孩子

时间:2019-04-30 15:24:34

标签: python dictionary

问题出在这里

我有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])

2 个答案:

答案 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个大学生是均匀分布的。