第一章:数据结构和算法
1.1解压序列赋值给多个变量
即将N个元素的元组或者序列,赋值给N个变量
>>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
name, shares, price, (year, mon, day) = data
很简单,就不多说了
1.2解压可迭代对象赋值给多个变量
与1.1不同的地方在于,当可迭代对象的元素个数大于赋值的变量的时候的处理
给出的解决方案是用星号表达式来处理
>>> *trailing, current = [10, 8, 7, 1, 9, 5, 10, 3]
>>> trailing
[10, 8, 7, 1, 9, 5, 10]
>>> current
3
1.3保留最后N个元素
主要是collections.deque的使用
使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉
>>> q = deque(maxlen=3)
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q
deque([1, 2, 3], maxlen=3)
>>> q.append(4)
>>> q
deque([2, 3, 4], maxlen=3)
>>> q.append(5)
>>> q
deque([3, 4, 5], maxlen=3)
deque还提供了在队列两端添加和弹出操作
>>> q = deque()
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q
deque([1, 2, 3])
>>> q.appendleft(4)
>>> q
deque([4, 1, 2, 3])
>>> q.pop()
3
>>> q
deque([4, 1, 2])
>>> q.popleft()
4
队列的插入和删除元素时间复杂度是 o(1),而列表是o(n)
1.4从一个集合中获取最小或最大的N个元素
heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题
import heapq
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
print(heapq.nlargest(3, nums)) # Prints [42, 37, 23]
print(heapq.nsmallest(3, nums)) # Prints [-4, 1, 2]查找元素的个数相对集合个数较小的时候,用heaqp模块的nlargest()和nsmallest()比较好
当查找集合中唯一最大或最小的元素时,用max()和min()函数
当查找元素的个数和集合大小接近的时候,需要先排序然后再切片 处理(sorted(items)[-N:]或sorted(items)[N:])
还讨论了heapq关于堆数据结构的实现,使用nlargest() 和 nsmallest()函数时, 会先进行堆排序,然后取值
1.5实现一个有优先级的队列
heapq模块的heappush()和heappop()函数
import heapq
class PriorityQueue:
def __init__(self):
self._queue = []
self._index = 0
def push(self, item, priority):
heapq.heappush(self._queue, (-priority, self._index, item))
self._index += 1
def pop(self):
return heapq.heappop(self._queue)[-1]
push()会将一个元组放到队列中,优先级的实现也和这个元组有关
pop()函数调用heappop()函数,返回最小的元素。
如何界定最小的元素,是通过元组来实现的
>>> a = (1, 0, Item('foo'))
>>> b = (5, 1, Item('bar'))
>>> c = (1, 2, Item('grok'))
>>> a < b
True
>>> a < c
True
index是用来防止两个优先级相同时,做比较时如下报错时的解决方法
priority使用相反值的原因是因为heappop()函数返回的最小值,如果定义最高优先级的一个元素优先级为5,那么就需要他在堆里面最小,因此取相反数-5
>>> a = (1, Item('foo'))
>>> b = (5, Item('bar'))
>>> a < b
True
>>> c = (1, Item('grok'))
>>> a < c
Traceback (most recent call last):
File "", line 1, in
TypeError: unorderable types: Item() < Item()
使用方式
>>> class Item:
... def __init__(self, name):
... self.name = name
... def __repr__(self):
... return 'Item({!r})'.format(self.name)
...
>>> q = PriorityQueue()
>>> q.push(Item('foo'), 1)
>>> q.push(Item('bar'), 5)
>>> q.push(Item('spam'), 4)
>>> q.push(Item('grok'), 1)
>>> q.pop()
Item('bar')
>>> q.pop()
Item('spam')
>>> q.pop()
Item('foo')
>>> q.pop()
Item('grok')