python中考虑两个或三个索引(升序和降序组合)的列表排序

2024-05-16 20:57:47 发布

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

我认为这是一个具有挑战性的。。。在

list = [["hasan",6,"bad","chennai"], 
        ["vishnu",7,"good","chennai"], 
        ["tabraiz",8,"good","bangalore"], 
        ["shaik",5,"excellent","chennai"], 
        ["mani",6,"avarage","kerala"], 
        ["cilvin",9,"excellent","chennai"]]

我把坏的分为1分,一般的2分,好的3分,优秀的4分。 我得到了按默认函数考虑1、2或3索引的升序排序的输出。在

考虑1个指标——一级排序

^{pr2}$

输出==>

 for i in list:
     print i

['tabraiz', 8, 'good', 'bangalore']
['hasan', 6, 'bad', 'chennai']
['vishnu', 7, 'good', 'chennai']
['shaik', 5, 'excellent', 'chennai']
['cilvin', 9, 'excellent', 'chennai']
['mani', 6, 'avarage', 'kerala']

考虑2个指标——二级排序:

list.sort(key= lambda x: (x[3],x[2]) 

输出==>

['tabraiz', 8, 'good', 'bangalore']
['hasan', 6, 'bad', 'chennai']
['vishnu', 7, 'good', 'chennai']
['shaik', 5, 'excellent', 'chennai']
['cilvin', 9, 'excellent', 'chennai']
['mani', 6, 'avarage', 'kerala']

考虑3个指标——三级排序

list.sort(key= lambda x: (x[3],x[2],x[1]) 

输出==>

['tabraiz', 8, 'good', 'bangalore']
['hasan', 6, 'bad', 'chennai']
['vishnu', 7, 'good', 'chennai']
['shaik', 5, 'excellent', 'chennai']
['cilvin', 9, 'excellent', 'chennai']
['mani', 6, 'avarage', 'kerala']

这些排序是按升序排列的。在

我想按升序和降序排列。在

比如,如果我想得到第三个索引按降序排列,第二个索引按升序排列,第一个索引按降序排列。在

我该怎么办???在

['mani', 6, 'avarage', 'kerala']
['hasan', 6, 'bad', 'chennai']
['vishnu', 7, 'good', 'chennai']
['cilvin', 9, 'excellent', 'chennai']
['shaik', 5, 'excellent', 'chennai']
['tabraiz', 8, 'good', 'bangalore']

Tags: 排序listbadgoodexcellentchennaiavaragevishnu
2条回答

我将从你的问题陈述中提取两个要点

  • 我把坏的分为1分,一般的2分,好的3分,优秀的4分。

  • 我想得到第三个索引按降序排列,第二个索引按升序排列,第一个索引按降序排列。

实施

#Remember do not name a variable that masks out a Python built-in
lst = [["hasan",6,"bad","chennai"],
        ["vishnu",7,"good","chennai"],
        ["tabraiz",8,"good","bangalore"],
        ["shaik",5,"excellent","chennai"],
        ["mani",6,"average","kerala"],
        ["cilvin",9,"excellent","chennai"]]
#i have given the priority to bad as 1, average as 2, good as 3 
#and excellent as 4
priority = {"bad":1, "average":2, "good":3, "excellent":4}
#3rd index in descending order, 2nd index in ascending order 
#and 1st index in descending order
def key(elem):
    return priority[elem[2]], -elem[1], elem[0]
pprint.pprint(sorted(lst, key = key, reverse = True))

输出

^{pr2}$

你可以将你的排序组合成一个操作,或者四个独立的操作。虽然我先编了一本字典,这样我就可以查到评分了

rating = {'excellent':4, 'good':3, 'average':2, 'bad':1}

接下来,对列表进行排序。你可以一次做一个:

^{pr2}$

最后一个排序优先,前一个排序只在最后一个排序相等时生效

一次排序会很快变得复杂,但应该更快地进行排序:

list.sort(cmp=lambda x,y:
              next([-cmp(x[0], y[0]),
                    cmp(x[1], y[1]),
                   -cmp(rating[x[2]], rating[y[2]]),
                    cmp(x[3], y[3])
              ])
         )

其中,列表中四项中的第一项优先,负号将该元素向后排序

相关问题 更多 >