python 排名函数_Python3中排序函数sort()和sorted()

一、函数sort()

sort() :仅对list对象进行排序,会改变list自身的顺序,没有返回值,即原地排序;

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

key :设置排序方法,或指定list中用于排序的元素;

reverse :升降序排列,默认为升序排列;

一维元素组成的list排序:忽略参数key

>>> a = ['TaoBao', 'Google', 'BaiDu']

>>> a.sort()

>>> a

['BaiDu', 'Google', 'TaoBao']

dict组成的list排序

参数key获取dict的key或value值进行排序

>>> a = [{'dell': 200}, {'mac': 100}]

# 字典的value排序

>>> a.sort(key=lambda x: list(x.values()))

>>> a

[{'mac': 100}, {'dell': 200}]

# 字典的key排序

>>> a.sort(key=lambda x: list(x.keys()))

>>> a

[{'dell': 200}, {'mac': 100}]

按dict的长度排序

>>> a = [{'mac': 200, 'huawei': 300, 'xiaomi': 150}, {'vivo': 210, 'Galaxy': 100}, {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}]

>>> a.sort(key=lambda x: len(x))

>>> a

[{'vivo': 210, 'Galaxy': 100}, {'mac': 200, 'huawei': 300, 'xiaomi': 150}, {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}]

多维元素 组成的list排序

按tuple的第2个元素排序

>>> a = [('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')]

>>> a

[('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')]

>>> a.sort(key=lambda x: x[1]) # lambda 函数:指定用于排序的元素

>>> a

[('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]

按tupel的第1个和3个元素进行排序

>>> a.sort(key=lambda x: (x[0], x[2]))

>>> a

[('linux', 2, 'a'), ('mac', 3, 'b'), ('mac', 1, 'c')]

二、sorted()

sorted() :对所有可迭代对象进行排序,返回排序后的新对象,原对象保持不变;

sorted(iterable [, key[, reverse]])

key :设置排序方法,或指定迭代对象中,用于排序的元素;

reverse :升降序排列,默认为升序排列;

一维元素组成的迭代对象排序

dict 的key/value排序:返回key/value排序后组成的list

# key排序

>>> a = {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}

>>> sorted(a)

['Smartisan', 'lenovo', 'meizu', 'oppo']

# value排序

>>> a = {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}

>>> sorted(a.values())

[50, 80, 120, 200]

dict的key/value排序:返回排序后(key, value)组成的list

# 按字典的value排序

>>> a = {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}

>>> sorted(a.items(), key=lambda x: x[1])

[('lenovo', 50), ('meizu', 80), ('Smartisan', 120), ('oppo', 200)]

string排序:返回字符组成的list

>>> a = 'python'

>>> sorted(a)

['h', 'n', 'o', 'p', 't', 'y']

string分割排序

>>> a = "This is a test string from Andrew"

>>> sorted(a.split(), key=str.lower) # split()函数进行字符串分割,key指定排序的方法

['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

多维元素的排序

dict组成的tuple或list排序:方法类似sort()

>>> a = ({'dell': 200}, {'mac': 100})

>>> sorted(a, key=lambda x: list(x.values()))

[{'mac': 100}, {'dell': 200}]

tuple组成的tuple或list排序:方法类似sort()

>>> a = (('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c'))

>>> sorted(a, key=lambda x: (x[1], x[2])) # 对tuple的第2、3个元素排序

[('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]

list组成的tuple或list排序:方法类似sort()

>>> a = [[1, 5, 9], [8, 4, 3], [4, 6, 2]]

>>> sorted(a, key=lambda x: x[0], reverse=True) # 按第1个元素降序排列

[[8, 4, 3], [4, 6, 2], [1, 5, 9]]

三、sort()与sorted()的区别和联系

sort():仅作用于list对象,没有返回值,修改对象本身;

sorted():作用于所有可迭代对象,返回新的排序对象,不修改原对象;

sort()函数不需要复制原有列表,消耗的内存较少,效率也较高;

sorted()函数功能强大,使用的范围更为广泛。

四、Operator模块函数

Python提供了一些方便的函数,使得访问方法更加容易和快速;

Operator模块是用C语言实现的,所以执行速度比python代码快;

Operator模块有itemgetter、attrgetter、methodcaller等常用函数;

可以使用函数itemgetter()替代排序函数(sort、sorted)中key参数的lambda函数,更快速方便地获取元素;

itemgetter():返回一个函数,通过该函数作用到目标对象上,获取目标对象对应位置上(index)的元素,即实现取元素的功能。

>>> a = [1, 2, 100]

>>> from operator import itemgetter

# 获取位置为2的元素

>>> f = itemgetter(2)

>>> f

operator.itemgetter(2)

>>> f(a)

100

# 获取位置为1和2的元素

>>> f = itemgetter(1, 2)

>>> f

operator.itemgetter(1, 2)

>>> f(a)

(2, 100)

抽象理解

t为目标对象,f = itemgetter(n)

调用 f(t) 时,返回t[n],即目标对象t中位置为n的元素

使用sort()或sorted()排序时,可以使用itemgetter()替代key参数中的lambda函数。

from operator import itemgetter

>>> a = [('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')]

>>> a.sort(key=itemgetter(1))

>>> a

[('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]

>>> sorted(a, key=itemgetter(2))

[('linux', 2, 'a'), ('mac', 3, 'b'), ('mac', 1, 'c')]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值