Python使用if语句对字典列表进行排序
给出这样一个字典列表:Python使用if语句对字典列表进行排序,python,list,sorted,Python,List,Sorted,给出这样一个字典列表: x = [ {'name':'a', 'student': 1 , 'age':19}, {'name':'b', 'student': 0 , 'age':10} ] sorted([d for d in x if d.get('student', 0) == 1], key=itemgetter('age')) 我只想在学生等于1的情况下按年龄排序。我能不能在下面的陈述中加上if sortedlist = sorted(x
x = [
{'name':'a', 'student': 1 , 'age':19},
{'name':'b', 'student': 0 , 'age':10}
]
sorted([d for d in x if d.get('student', 0) == 1], key=itemgetter('age'))
我只想在学生等于1的情况下按年龄排序。我能不能在下面的陈述中加上if
sortedlist = sorted(x, key=lambda k: k['age'])
谢谢,如果你想开除不等于1的学生:
sortedlist = sorted([x for x in dicts if x['student']==1], key=lambda k:k['age'])
如果您只是抛出这些值,您可以这样做:
x = [
{'name':'a', 'student': 1 , 'age':19},
{'name':'b', 'student': 0 , 'age':10}
]
sorted([d for d in x if d.get('student', 0) == 1], key=itemgetter('age'))
您正在使用的lambda函数是一种非常常见的操作,可以替换为。如果您使用itemgetter+a生成器,而不是lambda+list comp,您将获得迄今为止我发现的最佳性能。这是在包含10k元素的dicts列表上测试的。与列表comp+lambda相比,速度几乎提高了30%。此外,如果您可以安全地假设“student”始终是有效的密钥并直接访问它,那么与使用
d.get('student',0)=1相比,您再次获得了更快的速度
from operator import itemgetter
sorted((d for d in x if d['student']==1), key=itemgetter('age'))
- 关于lambda vs itemgetter的注意事项:itemgetter更快的原因(我对此非常肯定)是因为查找是在代码的C端完成的。然而,当您使用lambda时,您是在python端进行的,这是比较慢的
如果是学生,你想做什么=1.扔掉它?你想如何对不等于1的学生进行分类,lambda也是必要的吗?是的,我只是想把它扔掉……我很惊讶,在你必须选择的3个答案中,你选择了最慢的选项:-)@jdi:有些人发现使用简单的lambda清理器比在他们的代码中引入新的导入更容易,特别是如果是这样的话,他们必须查阅文档以确保正确使用它。(同时,其他人对lambdas有点过敏,并且对标准库的大部分内容感到满意。)执行速度不应该是决定因素,尤其是在Python中。在很多情况下,30%并不是一个很大的改进。我想你可能打算使用itemgetter?我认为你不能在口述中使用attrgetter。这是错误的:-/Spot在comment@jdi上。谢谢你的帮助。我想你可以告诉我,我只是经常使用它们,这样会很危险;)没问题+1用于使用生成器而不是列表理解的itemgetterNice示例。我想,最快也是最有说服力的回答是:谢谢。我确实测试了三个答案之间的数字。使用10k元素列表,您的速度比@sys.stderr快约13%