Python排序 - 对象列表

时间:2010-02-25 23:55:48

标签: python list sorting

如果可能,我想使用somelist.sort()方法执行此操作。

我有一个包含对象的列表,所有对象都有一个成员变量resultType,它是一个整数。我想用这个号码对列表进行排序。

我该怎么做?

谢谢!

4 个答案:

答案 0 :(得分:72)

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

这是另一种做你经常会看到的用法的方法:

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

如果您还没有看过,可能还需要查看sorted。它不会修改原始列表 - 它会返回一个新的排序列表。

答案 1 :(得分:10)

当然,它不一定是一个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)

来源:Python Sorting

所以,在你的情况下......

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'))

答案 2 :(得分:1)

somelist.sort(cmp = lambda x, y: cmp(x.resultType, y.resultType))

优于:

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

在第一种情况下,我们传入一个比较函数,用于成对比较列表中的元素。在第二种情况下,我们分配一个新的键函数结果列表和原始值。然后我们对该列表进行排序,然后从成对中删除键值。如果您的比较功能很昂贵,这非常有用,但如果比较非常便宜,则只是浪费内存。

也就是说,密钥版本的扩展看起来像这样:

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

对于一个简单的键功能,这显然是太多开销,所以我建议使用基于较轻功能的排序。

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

答案 3 :(得分:0)

对于Python 3.x,用户必须提供键功能。 Source

def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K(object):
    def __init__(self, obj, *args):
        self.obj = obj
    def __lt__(self, other):
        return mycmp(self.obj, other.obj) < 0
    def __gt__(self, other):
        return mycmp(self.obj, other.obj) > 0
    def __eq__(self, other):
        return mycmp(self.obj, other.obj) == 0
    def __le__(self, other):
        return mycmp(self.obj, other.obj) <= 0
    def __ge__(self, other):
        return mycmp(self.obj, other.obj) >= 0
    def __ne__(self, other):
        return mycmp(self.obj, other.obj) != 0
return K
>>> sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric))
[5, 4, 3, 2, 1]