python cookbook 1数据结构和算法 (1)

1. Python提供灵活的数据解包操做,若是想忽略某些值能够用下划线代替"_",仅能表明一个值python

>>>p = (4, 5)
>>>x, y = p
>>>x
4
>>>y
5

>>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
>>> name, shares, price, date = data
>>> name
1'ACME'
>>> date
(2012, 12, 21)
>>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
>>> _, shares, price, _ = data
>>> shares
50
>>> price
91.1

2若是想表明多个值,则需在变量明前加"*",该变量自动为list,仅在python3中支持.算法

>>> record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
>>> name, email, *phone_numbers = user_record
>>> name
'Dave'
>>> email
'dave@example.com'
>>> phone_numbers
['773-555-1212', '847-555-1212']
#only python3
>>> a=[1,2,3]
>>> b,c,*d=a
  File "<stdin>", line 1
    b,c,*d=a
        ^
SyntaxError: invalid syntax
效果相似与传参时的可变参数
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

3只保留最新的N条记录,api

deque建立了一个固定尺寸的队列,append向队列的右端添加,左端删除,也能够用appendleft()左添,右端删除,若是不指定maxlen,效果和list类似.在两边添加或pop的复杂度都是O(1),而list在左端添加或删除的复杂度是O(N)数据结构

from collections import deque
>>> 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)
>>>q.appendleft(7)
>>>q
deque([7,3, 4], maxlen=3)

4查找最大或最小的N个元素app

heapq有有两个功能,nlargest() 和 nsmallest(),分别是找最大或最小的N个元素,heapq模块实现了一个适用于Python列表的最小堆排序算法。 堆(heap)是一个树形数据结构,其中子节点与父节点是一种有序关系。老是知足a[k] <= a[2*k+1] ,a[k] <= a[2*k+2],堆顶元素 a[0] 永远是最小的.
spa

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]
portfolio =[
{'name':'IBM', 'shares': 100, 'price': 91.1},
{'name':'AAPL', 'shares': 50, 'price': 543.22},
{'name':'FB', 'shares': 200, 'price': 21.09},
{'name':'HPQ', 'shares': 35, 'price': 31.75}
]
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
#heapq还提供了另外一种方法
>>> nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
>>> heapq.heapify(num)#首先要heap化,生成树形结构
>>> num
[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
>>> heapq.heappop(num)
-4
>>> heapq.heappop(num)
1
>>> heapq.heappop(num)
2

若是你只是想找最小值,最大值,min(),max()更合适.若是N接近数据的len(),sorted(items)[:N] 或 sorted(items)[-N:] )是更合适的选择code

5实现优先级队列,能够利用heapq.heappush向list中添加一个list或tuple(list优先级比tuple低),list[0]或tuple[0]指定优先级,实际至关于比较大小的过程,list[0]小的优先级低,先删除.排序

>>> heapq.heappush(queue,[1,2])
>>> heapq.heappush(queue,[1,3])
>>> heapq.heappush(queue,[2,3])
>>> heapq.heappush(queue,[3,3])
>>> heapq.heappush(queue,(1,2))
>>> heapq.heappush(queue,(1,3))
>>> heapq.heappush(queue,(2,3))
>>> heapq.heappush(queue,(3,3))
>>> queue
[[1, 2], [1, 3], [2, 3], [3, 3], (1, 2), (1, 3), (2, 3), (3, 3)]
>>> heapq.heappop(queue)
[1, 2]
>>> heapq.heappop(queue)
[1, 3]
>>> heapq.heappop(queue)
[2, 3]
>>> heapq.heappop(queue)
[3, 3]
>>> heapq.heappop(queue)
(1, 2)
>>> heapq.heappop(queue)
(1, 3)
>>> heapq.heappop(queue)
(2, 3)
>>> heapq.heappop(queue)
(3, 3)
heapq其余方法
heapq.heapreplace(heap,item)    #删除最小元素值,添加新的元素值
>>>heap=[2, 4, 3, 5, 7, 8,9, 6] 
>>>heapq.heapreplace(heap,11)
2
>>> heap
[3, 4, 8, 5, 7, 11, 9, 6]
heapq.heappushpop(heap,item)    #首判断添加元素值与堆的第一个元素值对比,若是大于则删除最小元素,而后
#添加新的元素值,不然不更改堆
>>> heapq.heappushpop(heap,2)
2
>>> heap
[3, 4, 8, 5, 7, 11, 9, 6]
>>> heapq.heappushpop(heap,4)
3
>>> heap
[4, 4, 8, 5, 7, 11, 9, 6]
heapq.merge(...)            #将多个堆合并
相关文章
相关标签/搜索