Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用if语句对字典列表进行排序_Python_List_Sorted - Fatal编程技术网

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%