详解python中sort与sorted

函数 sort()用于列表中元素的排序
list.sort() 不会返回对象,并没有创建新对象,会改变原有的list,所以元祖(tuple)不可以用list排序,元祖不可变.
函数sort()会默认按照升序排列,能否让sort()函数按我们想要的排列方式进行排列呢?
sort()函数原型:list.sort(key=None,reverse=False)

一、sort的基本参数
(1)key参数:key接受的是一个只有一个形参的函数,形式如下:
  def f(a)
  return len(a)
  key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序
  代码如下:
  li = ["bb","a","ccc","dddd","e"]
  li.sort()                       
  print(li)       #['a', 'bb', 'ccc', 'dddd', 'e']
  这是默认的排序方式,但是加权值之后...
  def f(a):                    
  return len(a)
  li.sort(key=f)
  print(li)       #['a', 'e', 'bb', 'ccc', 'dddd']

  注:权值返回的是len(a),相当于比较每个元素的长度,所以是#['a', 'e', 'bb', 'ccc', 'dddd'],最开始默认的sort是按照a b c d e的字母顺序排列,假如把返回值变为1---return 1的话,输出的还是['bb', 'a', 'ccc', 'dddd', 'e'] 是写列表时候最原始的顺序  
    所以个人理解,权值就是自己定义的一种排序规则,想怎么都可以。

(2)reverse参数
  reverse接受的是一个bool类型的值 (Ture or False),表示是否颠倒排列顺序,一般默认的是False,注意第一个字母是大写的
  代码如下:
  li = ["bb","a","ccc","dddd","e"]
  li.sort(reverse=True)            
  print(li)                    #['e', 'dddd', 'ccc', 'bb', 'a']


(3)补充说明 
  在python2里面的sort()函数是有三个参数的:L.sort(cmp=None, key=None, reverse=False)
  其中的cmp在python3里面已经被删除了
  cmp参数:
  cmp接受一个函数,拿整形举例,形式为:
  def f(a,b):
  return a-b
 
  如果排序的元素是其他类型的,你所定义的这个函数只需满足a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数就行了,cmp()函数本身在python2里是一个内置函数



二、sort与sorted
  sort()方法是list内置排序
  sorted()方法是python内置的全局排序方法,对可迭代的序列排序生成新的序列。
  先看一段代码:
  a=[9,8,7,6,5,4,3,2,1]
  a.sort()
  print(a)         #[1,2,3,4,5,6,7,8,9]还是a这个数列,只不过顺序变了

  b=[9,8,7,6,5,4,3,2,1]
  c=sorted(b)
  print(b)         #[9,8,7,6,5,4,3,2,1] b顺寻没变 ,还是原来的b
  print(c)         #[1, 2, 3, 4, 5, 6, 7, 8, 9] c是新生成的数列,是b拍完顺序的

  由以上可知,list.sort()方法会按照升序将列表重新排列,不会保留原列表。而sorted()会返回副本,原始输入不变。

  sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素x,y,如果x应该排在y前面,则返回-1;如果x应排在y后面,则返回1;如果x与y相等,则返回0。
  因此,如果要实现倒序排列,只需编写一个reverse_cmp函数:    
  def reversed_cmp(x, y):
      if x > y:
          return -1
      if x < y:
          return 1
      return 0
  如此,调用sorted()并传入reverse_cmp就可以实现倒序排列:
  sorted([36, 5, 12, 9, 21], reversed_cmp)          #排序完就是[36, 21, 12, 9, 5]
 
  注:sorted()对字符串排序时,默认按照ASCII码大小比较,顺序是A,B,C...X,Y,Z...a,b,c...x,y,z
    
















      

猜你喜欢

转载自blog.csdn.net/weixin_41236295/article/details/79807005