Python学习笔记——列表排序

Python内建的list.sort()方法和sorted()函数都可以实现对列表进行排序。

         一、list.sort()方法:list.sort(key=function,  reverse=Boolean)

         list.sort()方法是对列表list直接进行排序,排序完成后原来的list列表中的元素位置变化,按排序顺序排列。

         可选的关键字参数reverse为布尔型数据,设置排序方向,默认值是False,按照升序排序。当reverse值可为True时,按照降序排序。

         例如:

         1  list1  =  [3,  5,  2,  4,  1]

         2  list1.sort()

         3  print(list1)

         输出结果为:[1,  2,  3,  4,  5]

         1  list1  =  [3,  5,  2,  4,  1]

         2  list1.sort(reverse=True)

         3  print(list1)

         输出结果为:[5,  4,  3,  2,  1]

         可选的关键字参数key接收一个函数作为参数,该函数必须是只接受一个参数的函数,并且该函数能以列表中的任一元素作为参数进行加工,返回同类型可比数据。

         当传入有效的key参数时,list.sort()方法将对列表中的每个元素计算key函数返回值,并根据各元素的key函数计算值来对列表中原有元素进行排序。

         例如,当我们对一个以字符串形式存放的浮点数列表排序时,Python是以字符串大小比较规则来排序的:

         1  list1  =  ['12.3',  '4.5',  '0.62',  '9.54',  '1.21']

         2  list1.sort()

         3  print(list1)

         输出结果为:['0.62',  '1.21',  '12.3',  '4.5',  '9.54']

         如果以float()函数作为参数传递给key,再对该列表进行排序,将会得到按转换成浮点数后的大小排序的字符串列表。

         1  list1  =  ['12.3',  '4.5',  '0.62',  '9.54',  '1.21']

         2  list1.sort(key=float)

         3  print(list1)

         输出结果为:['0.62',  '1.21',  '4.5',  '9.54',  '12.3']

         还可以自定函数满足个性化排序需求:

         1  list1  =  ['23',  '45',  '62',  '54',  '21']

         2

         3  def  r1(s):

         4         return  s[-1:]

         5 

         6  list1.sort(key=r1)

         6  print(list1)

         输出结果为:['21',  '62',  '23',  '54',  '45'],即实现了将字符串按最后一个字符的大小排序。

         如果列表中有某个元素不能作为key函数的参数进行计算,则会报错:

         1  list1  =  ['23',  '45',  62,  '54',  '21']

         2

         3  def  r1(s):

         4         return  s[-1:]

         5 

         6  list1.sort(key=r1)

         7  print(list1)

         上例中列表的第三个元素62是整数,r1函数只能处理字符串,运行到第4行时会报错:

         TypeError:  'int'  object  is  not  subscriptable。

         下面的例子中,函数r1虽然能对所有元素进行处理,但是每个元素计算后的返回值类型不一样,不能进行比较大小操作:

         1  list1  =  ['23',  '45',  ('3',  '2'),  '54',  '21']

         2

         3  def  r1(s):

         4         return  s[-1:]

         5 

         6  list1.sort(key=r1)

         7  print(list1)

         列表中第三个元素用r1函数计算后的返回值是一个只有一个元素的元组('2',  ),与其他元素计算结果'3',  '5',  '4',  '1'等字符串无法相互比较大小,程序运行到第6行时会报错:

         TypeError:  '<'  not  supported  between  instances  of  'tuple'  and  'str'

         如果把函数r1改一下:

         1  list1  =  ['23',  '45',  ('3',  '2'),  '54',  '21']

         2

         3  def  r1(s):

         4         return  s[-1]

         5 

         6  list1.sort(key=r1)

         7  print(list1)

         这时第三个元素的计算结果为字符串'2',可以和其他元素计算值比较,排序就能进行了,运行结果为:

         ['21',  ('3',  '2'),  '23',  '54',  '45']

         这是典型的python崇尚鸭子类型的表现:一群鸭子(字符串)进行游泳比赛(排序),里面混进了一只鸡(元组),但是Python不管这只鸡是不是真鸭子,只要这只穿上脚蹼的鸡能像鸭子一样游泳(截取最后一位的结果为字符串)就行,结果这只鸡就成了获得游泳比赛亚军的“鸭子”。哈,跑题了,今天刚学习了一篇介绍鸭子类型的文章,对鸭子类型有了一点点理解,写到这个例子有感而发。

         二、sorted()函数:sorted(iterable,  key=function,  reverse=Boolean)

         sorted()函数以iterable排序后的结果创建有序列表,原可迭代对象iterable保持不变。

         例如:

         1  tup1  =  ('23',  '45',  ('3',  '2'),  '54',  '21')

         2

         3  def  r1(s):

         4         return  s[-1]

         5 

         6  list1  =  sorted(tup1,  key=r1,  reverse=True)

         7  print('tup1:',  tup1)

         8  print('list1:',  list1)

         输出结果:

         tup1:  ('23',  '45',  ('3',  '2'),  '54',  '21')

         list1:  ['45',  '54',  '23',  ('3',  '2'),  '21']

         sorted()函数可以对任何可迭代的对象排序,而list.sort()方法不行。

         1  tup1  =  ('23',  '45',  ('3',  '2'),  '54',  '21')

         2

         3  def  r1(s):

         4         return  s[-1]

         5 

         6  tup1.sort(key=r1,  reverse=True)

         7  print('tup1:',  tup1)

         报错:AttributeError:  'tuple'  object  has  no  attribute  'sort'

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值