Sorted模块
sorted(iterable, ***, key=None, reverse=False)
Return a new sorted list from the items in iterable.
from operator import itemgetter
import time
lista = [1, 4, 6, 7, 3, 2, 10, 0]
listb = ['12', 'a', 'c', 'b', '4', '3c', 'b5']
print(sorted(lista)) #[0, 1, 2, 3, 4, 6, 7, 10]
print(sorted(listb)) #['12', '3c', '4', 'a', 'b', 'b5', 'c']
listc = [
{'name': 'a', 'age': 23, 'price': 500},
{'name': 'a', 'age': 23, 'price': 600},
{'name': 'b', 'age': 25, 'price': 500},
{'name': 'b', 'age': 22, 'price': 300},
{'name': 'c', 'age': 25, 'price': 2400},
{'name': 'c', 'age': 23, 'price': 2400},
]
print(sorted(listc, key=lambda s: (s['age'], s['price'])))
#[{'name': 'b', 'age': 22, 'price': 300}, {'name': 'a', 'age': 23, 'price': 500}, {'name': 'a', 'age': 23, 'price': 600}, {'name': 'c', 'age': 23, 'price': 2400}, {'name': 'b', 'age': 25, 'price': 500}, {'name': 'c', 'age': 25, 'price': 2400}]
# 可以使用itemgetter替代lambda,效率更高
print(sorted(list3,key=itemgetter('age','price')))
# 结果与lambda相同,下面测试一下两者的运行时间
start = time.clock()
print(sorted(listc, key=lambda s: (s['age'], s['price'])))
elapsed = (time.clock() - start)t
print("lambda time used:", elapsed) #lambda time used: 2.93e-05
start = time.clock()t
print(sorted(listc, key=itemgetter('age', 'price')))
elapsed = (time.clock() - start)
print("itemgetter time used:", elapsed) #itemgetter time used: 1.2e-05
heapq模块
__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge',
'nlargest', 'nsmallest', 'heappushpop']
nsmallest(n, iterable, key=None)
Find the n smallest elements in a dataset, Equivalent to: sorted(iterable, key=key)[:n]
print(heapq.nsmallest(len(lista), lista))
print(heapq.nsmallest(len(listb), listb))
print(heapq.nsmallest(len(listc), listc, key=itemgetter('age', 'price')))
# 等同于sorted,为正序
nlargest(n, iterable, key=None)
Find the n largest elements in a dataset, Equivalent to: sorted(iterable, key=key, reverse=True)[:n]
print(heapq.nlargest(len(lista), lista))
print(heapq.nlargest(len(listb), listb))
print(heapq.nlargest(len(listc), listc, key=itemgetter('age', 'price')))
#等同于sorted的倒序
#[10, 7, 6, 4, 3, 2, 1, 0]
#['c', 'b5', 'b', 'a', '4', '3c', '12']
#[{'name': 'c', 'age': 25, 'price': 2400}, {'name': 'b', 'age': 25, 'price': 500}, {'name': 'c', 'age': 23, 'price': 2400}, {'name': 'a', 'age': 23, 'price': 600}, {'name': 'a', 'age': 23, 'price': 500}, {'name': 'b', 'age': 22, 'price': 300}]
heappush,heappop,heapify,heapreplace,heappushpop
#heapify:对序列进行堆排序,
#heappush:在堆序列中添加值
#heappop:删除最小值并返回
#heappushpop:添加并删除堆中最小值且返回,添加之后删除
#heapreplace:添加并删除队中最小值且返回,删除之后添加
nums=[34, 56, 3, 89, 102, 23, 2]
heapify(nums) #先进行堆排序
print(heappop(nums)) #2
print(nums) #[3, 56, 23, 89, 102, 34]
print(heappush(nums,50)) #添加操作,返回None
print(nums) #[3, 56, 23, 89, 102, 34, 50]
print(heappushpop(nums,10)) #由于是添加后删除,所以返回这时候的最小值3
print(nums) #[10, 56, 23, 89, 102, 34, 50]
print(heappop(nums)) #10
print(nums) #[23, 56, 34, 89, 102, 50]
print(heapreplace(nums,10)) #由于是删除后添加,所以返回这时候的最小值23
print(nums) #[10, 56, 34, 89, 102, 50]
merge:合并多个序列
merge(iterables, key=None, reverse=False)*
list1 = [1, 2, 3, 4, 5, 12]
set1 = [2, 3, 9, 23, 54]
s = list(heapq.merge(list1, set1))
print(s) #[1, 2, 2, 3, 3, 4, 5, 9, 12, 23, 54]
list1 = [31, 2, 83, 24, 5, 12]
set1 = [2, 83, 9, 23, 54]
set2 = {2, 83, 9, 23, 54}
s1 = list(heapq.merge(list1, set1))
s2 = list(heapq.merge(list1, set2))
print(s1) # [2, 31, 2, 83, 24, 5, 12, 83, 9, 23, 54]
print(s2) # [2, 9, 31, 2, 83, 24, 5, 12, 83, 54, 23]
#可以看到s1和s2结果不相同,set1是列表,set2是字典,传入merge之后,把两者打印出来
print(iterables) # set1:([31, 2, 83, 24, 5, 12], [2, 83, 9, 23, 54])
# set2:([31, 2, 83, 24, 5, 12], {2, 9, 83, 54, 23})
#字典类型传入之后发生了改变
网友评论