Python排序-对象列表

2024-04-25 01:28:03 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

当然,它不一定是一只羔羊。任何传入的函数(如下面的函数)都将工作

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'))
somelist.sort(key = lambda x: x.resultType)

下面是另一种方法,可以做你经常看到的相同的事情:

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

如果您还没有看到^{},您可能还想查看它。它不会修改原始列表-它会返回一个新的排序列表。

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函数,这更清楚。

相关问题 更多 >