python之排序操作(sorted和heapq模块)

2019-12-27  本文已影响0人  ATNOW

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})
#字典类型传入之后发生了改变
上一篇 下一篇

猜你喜欢

热点阅读