功能易忘的 Python 库

功能易忘的 Python 库

其他库,比如 insect, deque 和 queue 可参考:https://blog.csdn.net/a40850273/article/details/95356001 

functools 下的 cmp_to_key 函数

Python 3 已经取消了内置函数 sort 和 sorted 函数的 cmp 参数,因此 Python 3 排序只能接受单一输入变量的函数作为 key 参数。不过可以通过 functools 下的 cmp_to_key 将一个两个输入参数的函数作为 key 参数传入。下面给出一个简单的例子。

from functools import cmp_to_key 
L=[9,2,23,1,2]
 
sorted(L,key=cmp_to_key(lambda x,y:y-x))
输出:
[23, 9, 2, 2, 1]
 
 
sorted(L,key=cmp_to_key(lambda x,y:x-y))
输出:
[1, 2, 2, 9, 23]

其中需要注意的是传入 cmp_to_key 的函数需要用返回正数、负数和零的方式来表达两个数的大小关系。如果理解为按顺序传入两个参数,那么返回正数表示需要调换这两个数的次序,反之不调整。

heapq 堆

heapq 实现了经典的堆,其提供了如下方法:

  • heapq.heappush(heap, item) 把item添加到heap中(heap是一个列表)
  • heapq.heappop(heap) 把堆顶元素弹出,返回的就是堆顶
  • heapq.heappushpop(heap, item) 先把item加入到堆中,然后再pop,比heappush()再heappop()要快得多
  • heapq.heapreplace(heap, item) 先pop,然后再把item加入到堆中,比heappop()再heappush()要快得多
  • heapq.heapify(x) 将列表x进行堆调整,默认的是小顶堆
  • heapq.merge(*iterables) 将多个列表合并,并进行堆调整,返回的是合并后的列表的迭代器
  • heapq.nlargest(n, iterable, key=None) 返回最大的n个元素(Top-K问题)
  • heapq.nsmallest(n, iterable, key=None) 返回最小的n个元素(Top-K问题)
import heapq
import random
 
# Top-K
mylist = list(random.sample(range(100), 10))
k = 3
largest = heapq.nlargest(k, mylist)
smallest = heapq.nsmallest(k, mylist)
print('original list is', mylist)
print('largest-'+str(k), '  is ', largest)
print('smallest-'+str(k), ' is ', smallest)
 
# heapify
print('original list is', mylist)
heapq.heapify(mylist)
print('heapify  list is', mylist)
 
# heappush & heappop
heapq.heappush(mylist, 105)
print('pushed heap is', mylist)
heapq.heappop(mylist)
print('popped heap is', mylist)
 
# heappushpop & heapreplace
heapq.heappushpop(mylist, 130)    # heappush -> heappop
print('heappushpop', mylist)
heapq.heapreplace(mylist, 2)    # heappop -> heappush
print('heapreplace', mylist)
'''
original list is [99, 44, 51, 45, 24, 82, 70, 97, 83, 3]
largest-3   is  [99, 97, 83]
smallest-3  is  [3, 24, 44]
original list is [99, 44, 51, 45, 24, 82, 70, 97, 83, 3]
heapify  list is [3, 24, 51, 45, 44, 82, 70, 97, 83, 99]
pushed heap is [3, 24, 51, 45, 44, 82, 70, 97, 83, 99, 105]
popped heap is [24, 44, 51, 45, 99, 82, 70, 97, 83, 105]
heappushpop [44, 45, 51, 83, 99, 82, 70, 97, 130, 105]
heapreplace [2, 45, 51, 83, 99, 82, 70, 97, 130, 105]
'''

猜你喜欢

转载自blog.csdn.net/a40850273/article/details/104271980