sorted()属于内置函数,作用于任意可迭代的对象,sorted() 函数总是会返回一个排序后的列表,原有列表保持不变
sort()一般作用于列表,属于列表的成员函数,它会直接修改原有列表,函数返回为 None。sort()函数总体来说不需要复制原有列表,所以消耗内存比较小,效率也比较高
a=['1',1,'a',3,7,'n']
sorted(a)
>>>[1, 3, 7, '1', 'a', 'n']
a
>>>['1', 1, 'a', 3, 7, 'n']
print a.sort()
>>>None
a
>>>[1, 3, 7, '1', 'a', 'n']
a = ['fsf','dadef','f''gt','frggr']
a.sort(key=len)
print(a)
>>>['fsf', 'fgt', 'dadef', 'frggr']
注:
如果实际应用中需要保存原列表,使用 sorted() 函数较为适合,否则可以选择 sort() 函数,因为 sort() 函数不需要复制原有列表,消耗的内存较少,效率也较高。
key 指定的函数将作用于 list 的每一个元素上,并根据 key 函数返回的结果进行排序
sorted([36, 5, -12, 9, -21], key=abs)
---[5, 9, -12, -21, 36]
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
---['about', 'bob', 'Credit', 'Zoo']
要进行反向排序,不必改动key函数,可以传入第三个参数 reverse=True :
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower,reverse=True)
---['Zoo', 'Credit', 'bob', 'about']
对于sorted()函数,他可以对不同的数据结构进行排序:
operator.itemgetter函数
operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号)
from operator import itemgetter
a = [1,2,3,4]
b=itemgetter(3,0) //定义函数b,获取对象的第3个域和第0个的值
print(b(a))
---(4, 1)
# 注意operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
# 基础版
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
from operator import itemgetter
L2 = sorted(L, key= itemgetter(0))
print(L2)
或者:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
a = sorted(L, key=lambda x: x[0])
print(a)
---[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
# 对字典进行排序
phonebook = {'Linda': '7750', 'Bob': '9345', 'Carol': '5834'}
from operator import itemgetter
sorted_ed = sorted(phonebook.items(), key=itemgetter(0))
print(sorted_ed)
---[('Bob', '9345'), ('Carol', '5834'), ('Linda', '7750')]
# 对多维list进行排序
from operator import itemgetter
gameresult = [['Bob', 95.00, 'A'], ['Alan', 86.0, 'C'],
['Mandy', 82.5, 'A'], ['Rob', 86, 'E']]
sorted_ed = sorted(gameresult , key=itemgetter(2, 1))
print(sorted_ed)
---[['Mandy', 82.5, 'A'], ['Bob', 95.0, 'A'], ['Alan', 86.0, 'C'], ['Rob', 86, 'E']]
# list中混合字典排序,按照 rating 和 name进行排序的实现方法
gameresult = [{"name":"Bob", "wins":10, "losses":3, "rating":75.00},
{"name":"David", "wins":3, "losses":5, "rating":57.00},
{"name":"Carol", "wins":4, "losses":5, "rating":57.00},
{"name":"Patty", "wins":9, "losses":3, "rating": 71.48}]
from operator import itemgetter
sorted_ed = sorted(gameresult, key=itemgetter("rating", "name"))
print(sorted_ed)
---[{'name': 'Carol', 'wins': 4, 'losses': 5, 'rating': 57.0}, {'name': 'David', 'wins': 3, 'losses': 5, 'rating': 57.0},
{'name': 'Patty', 'wins': 9, 'losses': 3, 'rating': 71.48}, {'name': 'Bob', 'wins': 10, 'losses': 3, 'rating': 75.0}]
# 不使用模块,只通过wins进行排序
a = sorted(gameresult,key=lambda x:x["wins"])
print(a)
---[{'wins': 3, 'losses': 5, 'name': 'David', 'rating': 57.0}, {'wins': 4, 'losses': 5, 'name': 'Carol', 'rating': 57.0},
{'wins': 9, 'losses': 3, 'name': 'Patty', 'rating': 71.48}, {'wins': 10, 'losses': 3, 'name': 'Bob', 'rating': 75.0}]
# 字典中混合list排序
mydict = {'Li': ['M', 7], 'Zhang': ['E', 2],
'Wang': ['P', 3], 'Du': ['C', 2],
'Ma': ['C', 9], 'Zhe': ['H', 7]}
from operator import itemgetter
sorted_ed = sorted(mydict.items(), key=itemgetter(1))
print(sorted_ed)
---[('Du', ['C', 2]), ('Ma', ['C', 9]), ('Zhang', ['E', 2]), ('Zhe', ['H', 7]), ('Li', ['M', 7]), ('Wang', ['P', 3])