为了账号安全,请及时绑定邮箱和手机立即绑定

按多列排序时,为每列设置升序降序

按多列排序时,为每列设置升序降序

慕哥6287543 2021-04-11 13:18:59
我有一个d要排序的列表。我首先按第一列进行排序。如果那是平局,那么我继续使用第二列进行排序。假设我想按升序按第一列排序,但按降序按第二列排序。升为默认值,使用该reverse键,我认为以下内容应能工作。sorted(d,key=lambda x: (x[0],x[1]),reverse=(False,True))但事实并非如此。它给出以下错误。    reverse=(False,True))TypeError: an integer is required (got type tuple)因此,如果我没有正确执行操作,该如何解决?还是这样做的方式完全不同?对此的建议将有所帮助。我的问题确实存在重复,但是已经有有趣的回答,因此我想保留它。
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

从文档:


reverse是一个布尔值。如果设置为True,则对列表元素进行排序,就好像每个比较都被反转一样。


因此,您想要的是类似以下内容的东西:


d.sort(key=lambda x: (x[0], -x[1]))

如果x[1]不是数字,请尝试:


d.sort(key=lambda x: x[1], reverse=True)

d.sort(key=lambda x: x[0])


查看完整回答
反对 回复 2021-04-27
?
手掌心

TA贡献1942条经验 获得超3个赞

(可能会过大,但是..)使用pandas和args ascending=[True, False]:


d = [[1,2], [2,2], [2,3], [2,4], [3,1]]

df=  pd.DataFrame(d)


sorted_values = df.sort_values(by=[0,1], ascending=[True,False])

sorted_list = sorted_values.agg(list,1).tolist()


[[1, 2], [2, 4], [2, 3], [2, 2], [3, 1]]


查看完整回答
反对 回复 2021-04-27
?
狐的传说

TA贡献1804条经验 获得超3个赞

我的解决方案:


from itertools import groupby, chain


l = ((1, 'b'),

     (1, 'd'),

     (2, 'a'),

     (1, 'a'))


def sort_multi(lst, index_normal, index_reversed):

    return list(chain.from_iterable([sorted(list(j), key=lambda v:v[index_reversed], reverse=True) for i, j in groupby(sorted(lst), key=lambda v:v[index_normal])]))



print(sort_multi(l, 0, 1))

输出:


[(1, 'd'), (1, 'b'), (1, 'a'), (2, 'a')]


查看完整回答
反对 回复 2021-04-27
  • 3 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号