我需要對物件串列進行排序。目前我正在這樣做:
mylist = [aobject, bobject, cobject]
mylist.sort(key=mykey)
def mykey(sortelem):
attribute1 = sortelem.attribute1
attribute2 = sortelem.attribute2
return (attribute1, attribute2)
現在我想按attribute1升序但attribute2降序排序。我總是可以做這樣的事情:
return (attribute1, -1 * attribute2)
但這似乎非常不合時宜。我在網上搜索過,但是很難搜索。
uj5u.com熱心網友回復:
如果是數字,則在元組內部使用- attribute2而不是attribute2最簡單的方法。attribute2
如果attribute2是一個字串,或者其他不能-1以有意義的方式相乘的東西,那么這個技巧就不起作用。
但是,請注意,lst.sort并且sorted保證在 python中是穩定的排序。特別是,這意味著以下兩個代碼片段是等效的:
# SORT ACCORDING TO A TUPLE
l.sort(key=lambda x: (x[0], x[1]))
# SORT TWICE
l.sort(key=lambda x: x[1])
l.sort(key=lambda x: x[0])
請注意,在第二個版本中,我們首先按決勝局排序,然后按主要標準排序。
在第一個版本中,如果這個標準是數字,我們可以通過將它乘以 -1 來按兩個標準之一的降序排序:
l.sort(key=lambda x: (x[0], -x[1]))
然而,在第二個版本中,我們可以使用可選引數按兩個標準之一的降序排序,reverse=True這適用于數字以及其他型別,例如字串。
l.sort(key=lambda x: x[1], reverse=True)
l.sort(key=lambda x: x[0])
最后,請注意,您可以使用or來定義自定義函式,而不是使用deforlambda作為排序鍵。operator.itemgetteroperator.attrgetter
例如,以下兩個代碼片段是等價的:
# FIRST VERSION
l.sort(key=lambda x: (x[0], x[1]))
# SECOND VERSION
from operator import itemgetter
l.sort(key=itemgetter(0, 1))
以下三個代碼片段是等效的:
# FIRST VERSION
def mykey(x):
x1 = x.attribute1
x2 = x.attribute2
return (x1, x2)
l.sort(key=mykey)
# SECOND VERSION
l.sort(key=lambda x: (x.attribute1, x.attribute2))
# THIRD VERSION
from operator import attrgetter
l.sort(key=attrgetter('attribute1', 'attribute2'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468045.html
