第一章 数据结构和算法
1.1 将序列分解为单独的变量
适用于元组、列表、字符串等。只要是可迭代的对象,都可以执行分解操作。唯一的要求是变量的总数和结构要与序列相同。
1.2 从任意长度的可迭代对象中分解元素
“*表达式”
以下代码中使用的“*args”,如果去掉*,是会报错的。
records = [(‘foo‘,1,2),(‘bar‘,‘hello‘),(‘foo‘,3,4)] for tag,*args in records: print(tag,*args)
拆分操作,和split结合使用,会实现非常好用的功能:
line = ‘nobody:*:-2:-2:Unprivileged User:/Var/empty:/usr/bin/false‘ uname,*fields,homedir,sh = line.split(‘:‘)
1.3 保留最后N个元素
下边一段代码还不是特别理解,对生成器比较生疏。
from collections import deque def search(lines,pattern,history): previous_lines = deque(maxlen=history) for line in lines: if pattern in line: yield line,previous_lines previous_lines.append(line) if __name__ == ‘__main__‘: with open(‘somefile.txt‘) as f: for line,prevlines in search(f,‘Python‘,5): for pline in prevlines: print(pline,end=‘‘) print(line,end=‘‘) print(‘-‘*20)
deque(maxlen=N)创建一个固定长度的队列,有新元素添加时,会自动删除最老的记录。
不指定长度的时候,创建一个无界限的队列:
from collections import deque q = deque() q.append(1) q.append(2) q.append(3) print(q) q.append(4)#右边添加元素 q.appendleft(0)#左边添加元素 print(q) q.pop()#删除最右边元素 print(q) q.popleft()#删除左边元素 print(q)
1.4 找到最大或最小的N个元素
heapq模块中的nlargest和nsmallest函数:
import heapq nums = [1,8,2,23,7,-4,16,23,42,37,2] print(heapq.nlargest(3,nums)) print(heapq.nsmallest(3,nums))
提供一个参数key,使其工作在更复杂的结构上:
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}, {‘name‘:‘YHOO‘,‘shares‘:45,‘price‘:16.35}, {‘name‘:‘ACME‘,‘shares‘:75,‘price‘:115.65}] cheap = heapq.nsmallest(3,portfolio,key=lambda s: s[‘price‘]) print(cheap) expensive = heapq.nlargest(3,portfolio,key=lambda s: s[‘price‘]) print(expensive)
如果正在寻找最大或者最小的N个元素,且同集合中元素的总数目相比,N很小,那么可以使用以下函数(性能更好):为什么?
nums = [1,8,2,23,7,-4,16,23,42,37,2] heap = list(nums) #找到第3小的元素 heapq.heappop(heap) heapq.heappop(heap) heapq.heappop(heap)
当所要寻找的元素数量相对较小时,nlargest和nsmallest函数才是最适用的。如果只是简单寻找最大和最小值,那么max和min函数会更快。如果N和集合本身大小差不多,通常更快的方法是先对集合排序,然后进行切片操作( sorted(items)[:N] 和sorted(items)[-N:] )。
1.5 实现优先级队列(暂时搁置)
1.6 在字典中将键映射到多个值上
一键多值字典,可以使用collections模块中的defaultdict类:
from collections import defaultdict d = defaultdict(list) d[‘a‘].append(1) d[‘a‘].append(2) d[‘b‘].append(3) print(d) d = defaultdict(set) d[‘a‘].add(1) d[‘a‘].add(2) d[‘b‘].add(3) print(d)
使用列表还是集合,取决于实际需要,注重顺序,则使用列表;希望去除重复值,则使用集合。
以上方法会自动创建字典表项以待稍后访问,也可以在普通字典上使用setdefault方法:
d = {} d.setdefault(‘a‘,[]).append(1) d.setdefault(‘a‘,[]).append(2) d.setdefault(‘b‘,[]).append(3) print(d)
1.7 让字典保持有序