python中的sort和sorted是什么意思_python中sort和sorted的另类用法

排序应该是处理list列表经常用到的方法,常用的就是sort和sorted。

一、两者的差异

1、list.sort()是list是内建方法,使用sort会直接改变原列表的顺序,而sorted(list)只会返回一个已排好序的列表,如下:

1 >>> a = ['a1', 'a2', 'a3', 'a11', 'a21']2 >>>a.sort()3 >>>a4 ['a1', 'a11', 'a2', 'a21', 'a3']5 >>> b = ['b1', 'b2', 'b3', 'b11', 'b21']6 >>>sorted(b)7 ['b1', 'b11', 'b2', 'b21', 'b3']8 >>>b9 ['b1', 'b2', 'b3', 'b11', 'b21']

2、sorted()可用于任何一个可迭代的对象,比如:

>>>members

[('Mark', 30, 12000), ('John', 24, 6000), ('Tim', 27, 8000), ('David', 26, 10000)]>>>sorted(members)

[('David', 26, 10000), ('John', 24, 6000), ('Mark', 30, 12000), ('Tim', 27, 8000)]

sorted首先选择了每个成员的第一个变量进行了排序。

二、实用的操作

sort()方法和sorted()函数都内置了一个key参数,用与在进行比较前指定每个元素上要调用的函数。这里就可以脑洞大开了。

1、大部分情况下,我们并不想看到类似下面这种排序:

1 >>>sorted(b)2 ['b1', 'b11', 'b2', 'b21', 'b3']

这是默认以字符进行排序的,而我们期望的结果往往是类似于['b1', 'b2', 'b3', 'b11', 'b21']的自然排序结果。这里就可以用key来调整。

1 >>> sorted(b, key=lambda n : int(n[1:]))2 ['b1', 'b2', 'b3', 'b11', 'b21']3 >>> sorted(b, key=lambda n : int(n[1:]), reverse=True)4 ['b21', 'b11', 'b3', 'b2', 'b1']

排序将按整数的大小进行,也可以加入reverse来控制逆序。

2、key也可用来控制排序的对象

>>>members

[('Mark', 30, 12000), ('John', 24, 6000), ('Tim', 27, 8000), ('David', 26, 10000)]>>>sorted(members)

[('David', 26, 10000), ('John', 24, 6000), ('Mark', 30, 12000), ('Tim', 27, 8000)]>>> sorted(members, key=lambda n: n[2])

[('John', 24, 6000), ('Tim', 27, 8000), ('David', 26, 10000), ('Mark', 30, 12000)]

上例就是按收入(成员第3项)进行排序的。也可以先按年龄,再按收入进行排序:

>>> sorted(members, key=lambda n: (n[1], n[2]))

[('John', 24, 6000), ('David', 26, 10000), ('Tim', 27, 8000), ('Mark', 30, 12000)]

3、最骚气的当然是引入一些内库了,比如operator模块

operator.itemgetter()  通过下标

operator.attrgetter()  通过参数

这里只举个简单的例子,有兴趣的话可以去搜一搜具体的操作方法。

1 >>> from operator importitemgetter, attrgetter2 >>> sorted(members, key=itemgetter(1))3 [('John', 24, 6000), ('David', 26, 10000), ('Tim', 27, 8000), ('Mark', 30, 12000)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值