Python的排序字典的列表,if语句

问题描述:

鉴于这样的词典列表:Python的排序字典的列表,if语句

x = [ 
     {'name':'a', 'student': 1 , 'age':19}, 
     {'name':'b', 'student': 0 , 'age':10} 
    ] 

我想年龄只有当学生等于1排序它可以不知何故,我把,如果在以下陈述?

sortedlist = sorted(x, key=lambda k: k['age']) 

感谢,

+4

而其他的呢? – 2012-03-26 18:56:14

+3

如果学生!= 1,你想做什么?把它扔出去? – istruble 2012-03-26 18:56:27

+0

,你想如何排序不等于1的学生? ,也是lambda必然的? – alonisser 2012-03-26 18:57:15

如果使用itemgetter +一个生成器,而不是lambda + list comp,您可以获得迄今为止发现的最佳性能。这是在一个10k元素的排行榜上进行测试的。列表comp + lambda几乎增加了30%的速度。此外,如果你可以安全地假定“学生”始终是一个有效的密钥,并直接访问它,你又在具有使用d.get('student', 0) == 1

from operator import itemgetter 

sorted((d for d in x if d['student']==1), key=itemgetter('age')) 
  • 备注拉姆达VS itemgetter获得更多的速度:原因itemgetter更快(我对此大部分都很肯定)是因为查找是在代码的C端完成的。而当你使用lambda时,你会在较慢的python端执行它。
+0

使用生成器而不是列表解析的好例子。最快和最pythonic的答案,艾莫。 – istruble 2012-03-26 21:29:20

+0

istruble:谢谢。我实际上测试了所有三个答案之间的数字。使用10k元素列表,您的速度比@ sys.stderr快13% – jdi 2012-03-26 21:36:31

在这种情况下,你想扔掉那些不等于一个学生:

sortedlist = sorted([x for x in dicts if x['student']==1], key=lambda k:k['age']) 

如果你是刚刚抛出的值,你可以做像这样:

sorted([d for d in x if d.get('student', 0) == 1], key=itemgetter('age')) 

您使用的lambda函数是一个非常常见的操作,可以被替换w ith itemgetter

+1

我想你可能打算使用itemgetter?您不能使用attrgetter字典我不认为。这是打破: -/ – jdi 2012-03-26 19:22:32

+0

点评@jdi。谢谢你的收获。我认为你可以告诉我只有经常使用它们才有危险;) – istruble 2012-03-26 19:28:11

+0

没有问题。 +1也用于itemgetter – jdi 2012-03-26 20:48:36