一、函數(shù)sort()
sort() :僅對(duì)list對(duì)象進(jìn)行排序,會(huì)改變list自身的順序,沒有返回值繁仁,即原地排序;
list.sort(key=None, reverse=False)
- key :設(shè)置排序方法辕狰,或指定list中用于排序的元素改备;
- reverse :升降序排列,默認(rèn)為升序排列蔓倍;
- 一維元素組成的list排序:忽略參數(shù)key
>>> a = ['TaoBao', 'Google', 'BaiDu']
>>> a.sort()
>>> a
['BaiDu', 'Google', 'TaoBao']
- dict組成的list排序
- 參數(shù)key獲取dict的key或value值進(jìn)行排序
>>> 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的長(zhǎng)度排序
>>> 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個(gè)元素排序
>>> 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 函數(shù):指定用于排序的元素
>>> a
[('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]
- 按tupel的第1個(gè)和3個(gè)元素進(jìn)行排序
>>> a.sort(key=lambda x: (x[0], x[2]))
>>> a
[('linux', 2, 'a'), ('mac', 3, 'b'), ('mac', 1, 'c')]
二悬钳、sorted()
sorted() :對(duì)所有可迭代對(duì)象進(jìn)行排序,返回排序后的新對(duì)象偶翅,原對(duì)象保持不變默勾;
sorted(iterable [, key[, reverse]])
- key :設(shè)置排序方法,或指定迭代對(duì)象中聚谁,用于排序的元素母剥;
- reverse :升降序排列,默認(rèn)為升序排列形导;
- 一維元素組成的迭代對(duì)象排序
- 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()函數(shù)進(jìn)行字符串分割环疼,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])) # 對(duì)tuple的第2、3個(gè)元素排序
[('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個(gè)元素降序排列
[[8, 4, 3], [4, 6, 2], [1, 5, 9]]
三朵耕、sort()與sorted()的區(qū)別和聯(lián)系
sort():僅作用于list對(duì)象炫隶,沒有返回值,修改對(duì)象本身阎曹;
sorted():作用于所有可迭代對(duì)象伪阶,返回新的排序?qū)ο螅恍薷脑瓕?duì)象处嫌;
sort()函數(shù)不需要復(fù)制原有列表栅贴,消耗的內(nèi)存較少,效率也較高熏迹;
sorted()函數(shù)功能強(qiáng)大檐薯,使用的范圍更為廣泛。
四注暗、Operator模塊函數(shù)
Python提供了一些方便的函數(shù)厨剪,使得訪問方法更加容易和快速;
Operator模塊是用C語言實(shí)現(xiàn)的友存,所以執(zhí)行速度比python代碼快;
Operator模塊有itemgetter陶衅、attrgetter屡立、methodcaller等常用函數(shù);
可以使用函數(shù)itemgetter()替代排序函數(shù)(sort、sorted)中key參數(shù)的lambda函數(shù)膨俐,更快速方便地獲取元素勇皇;
itemgetter():返回一個(gè)函數(shù),通過該函數(shù)作用到目標(biāo)對(duì)象上焚刺,獲取目標(biāo)對(duì)象對(duì)應(yīng)位置上(index)的元素敛摘,即實(shí)現(xiàn)取元素的功能。
>>> 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為目標(biāo)對(duì)象乳愉,f = itemgetter(n)
調(diào)用 f(t) 時(shí)兄淫,返回t[n],即目標(biāo)對(duì)象t中位置為n的元素使用sort()或sorted()排序時(shí)蔓姚,可以使用itemgetter()替代key參數(shù)中的lambda函數(shù)捕虽。
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')]