【问题标题】:sorting of list of list by considering two or three index (combining ascending and descending order) in python通过在python中考虑两个或三个索引(结合升序和降序)对列表列表进行排序
【发布时间】:2014-02-06 10:45:09
【问题描述】:

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

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 个索引 -- 第一级排序

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

输出==>

 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个索引——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']

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

我想要一些升序和一些降序。

例如,如果我想输出降序排列的第 3 个索引、升序排列的第 2 个索引和降序排列的第 1 个索引。

我应该怎么做???

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

【问题讨论】:

  • 请格式化您的问题以使其可读。用四个空格缩进代码。
  • 您的预期输出与描述不符。请澄清。

标签: python list sorting


【解决方案1】:

您可以将排序合并为一个操作,或四个独立的操作。首先,虽然我做了一本字典,所以我可以查看评级

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

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

list.sort(key=lambda x:x[0], reverse=False)         # sorting first name alphabetically
list.sort(key=lambda x:x[1], reverse=True)         # sorting by whatever the number is
list.sort(key=lambda x:rating[x[2]], reverse=True) # sorting by rating, with lookup
list.sort(key=lambda x:x[3], reverse=False)         # sorting by last name

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

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

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

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

【讨论】:

  • @JonClements,说得好。第一部分可以解决这个问题(用反向标志编辑);第二部分需要更多思考
  • 我收到了TypeError: next expected at most 2 arguments, got 4
  • 谢谢@thefourtheye。忘记将内容包装在列表中
  • @mhlester 现在,我收到了TypeError: list object is not an iterator :(
【解决方案2】:

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

  • 我已经把差1分,一般2分,好3分,优秀4分优先

  • 我想得到输出,其中第 3 个索引按降序排列,第 2 个索引按升序排列,第 1 个索引按降序排列。

实施

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

输出

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

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 2021-07-19
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2018-05-03
    • 2014-12-11
    • 2011-07-17
    相关资源
    最近更新 更多