sort和sorted深入理解----引子:多维列表,如何实现第一个元素升序,第二个元素降序

Posted liangmingshen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sort和sorted深入理解----引子:多维列表,如何实现第一个元素升序,第二个元素降序相关的知识,希望对你有一定的参考价值。

一、列表内建方法--sort()

作用就地对列表排序(直接在原列表上做排序)

语法

  list.sort(func=None, key=None, reverse=False)

  • 当reverse=False时:正向排序;当reverse=True时:逆向排序。默认为False。
  • 执行完后会改变原来的list,如果你不需要原来的list,这种效率稍微高点
  • 该方法没有返回值

例子

>>> arr = [2,8,4,6,9,1,3]
>>> arr.sort()
>>> arr
[1, 2, 3, 4, 6, 8, 9]

  

 

二、内建函数sorted()

作用:对可迭代对象排序,返回一个新的已经排序好的list

差别:

  • sorted()不会改变原来的list,而是会返回一个新的已经排序好的list
  • list.sort()方法只是应用在 list 上的方法,而sorted()可用于任何一个可迭代对象

语法:

  sorted(iterable, key=None, reverse=False)

  • 当reverse=False时:为正向排序;当reverse=True时:为反向排序。默认为False。
  • 执行完后返回一个新的排序好的list

例子

>>> arr = (3,6,7,2,1,4)
>>> sorted(arr)
[1, 2, 3, 4, 6, 7]

 

 

三、高级用法

参数key:

参数key:带一个参数的函数(排序时,会依次传入列表的每一项,作为该函数的参数)。该函数用于在比较排序之前进行的操作

例子:

每个字符串比较之前,需要统一小写

>>> test=["A","a","E","W","o"]
>>> test.sort()
>>> test
[‘A‘, ‘E‘, ‘W‘, ‘a‘, ‘o‘]
>>> test.sort(key=lambda x:x.lower())
>>> test
[‘A‘, ‘a‘, ‘E‘, ‘o‘, ‘W‘]

 

对于复杂的对象,使用对象的下标作为key。

例子:

>>> student_tuples = [
...     (john, A, 15),
...     (jane, B, 12),
...     (dave, B, 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age
[(dave, B, 10), (jane, B, 12), (john, A, 15)]

 

使用对象的属性进行操作:

>>> class Student:
...     def __init__(self, name, grade, age):
...         self.name = name
...         self.grade = grade
...         self.age = age
...     def __repr__(self):
...         return repr((self.name, self.grade, self.age))
>>>
>>> student_objects = [
...     Student(john, A, 15),
...     Student(jane, B, 12),
...     Student(dave, B, 10),
... ]
>>> sorted(student_objects, key=lambda student: student.age)   # sort by age
[(dave, B, 10), (jane, B, 12), (john, A, 15)]

 

 

重点来了!

1.多维数组,如何在按照第一个元素排序的基础上,再按第二个关键字进行排序?

>>> arr = [(d,3),(a,5),(d,1),(c,2),(d,2)]
>>> sorted(arr, key = lambda x:(x[0],x[1]))
[(a, 5), (c, 2), (d, 1), (d, 2), (d, 3)]

 

2.多维数组,如何实现第一个元素按升序,第二个元素按降序来排列?

>>> arr = [(‘d‘,3),(‘a‘,5),(‘d‘,1),(‘c‘,2),(‘d‘,2)]
>>> sorted(arr, key=lambda x:(x[0], -int(x[1])))
[(‘a‘, 5), (‘c‘, 2), (‘d‘, 3), (‘d‘, 2), (‘d‘, 1)]

 

以上是关于sort和sorted深入理解----引子:多维列表,如何实现第一个元素升序,第二个元素降序的主要内容,如果未能解决你的问题,请参考以下文章

深入理解快速排序和 STL 的 sort 算法

深入理解Arrays.sort() (转)

pandas数据排序sort_values后面inplace=True与inplace=False的实例驱动理解

多维数组排序

实现对多维数组按照某个键值排序的两种方法(array_multisort和array_sort)

awk PROCINFO["sorted_in"] 多维数组排序问题