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函数更清晰。