Pythonsorting – 对象列表

如果可能的话,我想使用somelist.sort()方法来做到这一点。

我有一个包含对象的列表,所有对象都有一个整型的成员variablesresultType。 我想用这个数字来sorting列表。

我该怎么做呢?

谢谢!

somelist.sort(key = lambda x: x.resultType) 

这是另一种方法来做同样的事情,你会经常看到使用:

 import operator s.sort(key = operator.attrgetter('resultType')) 

如果你还没有看过,你可能也想看看sorted 。 它不会修改原始列表 – 它会返回一个新的sorting列表。

当然,它不一定是lambda。 任何传入的函数,如下面的函数都可以工作

 def numeric_compare(x, y): if x > y: return 1 elif x == y: return 0 else: #x < y return -1 a = [5, 2, 3, 1, 4] a.sort(numeric_compare) 

来源: Pythonsorting

所以,在你的情况下…

 def object_compare(x, y): if x.resultType > y.resultType: return 1 elif x.resultType == y.resultType: return 0 else: #x.resultType < y.resultType return -1 a.sort(object_compare) 

前面提到的lambda绝对是最紧凑的方法,但也有使用operator.itemgetter 。

 import operator #L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)] map(operator.itemgetter(0), L) #['c', 'd', 'a', 'b'] map(operator.itemgetter(1), L) #[2, 1, 4, 3] sorted(L, key=operator.itemgetter(1)) #[('d', 1), ('c', 2), ('b', 3), ('a', 4)] 

所以你会使用itemgetter('resultType')。 (假定getitem被定义。)

 sorted(L, key=operator.itemgetter('resultType')) 
 somelist.sort(cmp = lambda x, y: cmp(x.resultType, y.resultType)) 

比…更好:

 somelist.sort(key = lambda x: x.resultType) 

在第一种情况下,我们传递一个比较函数,用于对列表中的元素进行配对比较。 在第二种情况下,我们分配一个新的关键函数结果和原始值对的列表。 然后,我们对这个列表进行sorting,然后去掉对中的关键值。 如果你的比较函数比较昂贵的话,这是非常有用的,但是如果比较成本很低的话,这只是一个内存的浪费。

也就是说,关键版本的扩展如下所示:

 l = [y for x,y in sorted(zip([key(i) for i in l], l))] 

对于一个简单的按键function,这显然是太多的开销,所以相反,我会build议使用基于较轻function的sorting。

请注意,在小于,等于和大于的情况下,cmp函数参数需要返回-1,0,1。 你可以自己写,但你也可以使用内置的cmp函数更清晰。