我需要整理一个物品 list .目前我是这样做的:

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)

但这似乎很discord.我在网上搜索过,但这是一件很难搜索的事情.

推荐答案

在元组中使用- attribute2而不是attribute2是最简单的方法

如果attribute2是一个字符串,或者不能以有意义的方式乘以-1,那么这个技巧就不起作用.

但是,请注意,在python中,lst.sortsorted保证是stable个排序.特别是,这意味着以下两个代码段是等效的:

# 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])

请注意,在第二个版本中,我们首先按照平局 destruct 者进行排序,然后按照主要标准进行排序.

对于第一个版本,如果该标准是数字的,我们可以将其乘以-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])

最后,请注意,您可以使用operator.itemgetteroperator.attrgetter,而不是使用deflambda定义自定义函数作为排序键.

例如,以下两个代码段是等效的:

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

Python相关问答推荐

过滤绕轴旋转的螺旋桨

使用regex分析具有特定字符的字符串(如果它们存在)

在Python中为变量的缺失值创建虚拟值

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

如何自动抓取以下CSV

如何标记Spacy中不包含特定符号的单词?

scikit-learn导入无法导入名称METRIC_MAPPING64'

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

使用groupby Pandas的一些操作

如何使用pytest来查看Python中是否存在class attribution属性?

给定高度约束的旋转角解析求解

在Django admin中自动完成相关字段筛选

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

从旋转的DF查询非NaN值

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

巨 Python :逆向猜谜游戏

使用tqdm的进度条

如何获得3D点的平移和旋转,给定的点已经旋转?