流畅的python之第二部分数据结构总结
-
容器序列
- list、tuple、collections.deque
- 可存放不同类型数据
- 存放的是对象的引用
-
扁平序列
- str、bytes
- 只能容纳一种类型
- 存放的是值,实际上扁平序列是一段连续的内存空间
-
可变序列
- list、collections.deque
-
不可变序列
- tuple、str、bytes
-
列表推导
- [ord(x) for x in str_a]
- 随机生成16位密码 passd = [chr(np.random.randint(33,127)) for i in range(16)]
- [ord(x) for x in str_a if ord(x) > 127]
- list(filter ( lambda c : c > 127, map (ord, str_a)))
- 前两者效果相同
- chr() ASCII值 转 字符串
- ord() 字符串 转 ASCII值
-
笛卡尔积
- tshirts = [(color,size) for color in colors for size in sizes]
- 嵌套关系与顺序有关 先颜色排列 后尺码排列
-
生成器表达式
- tuple(ord(x) for x in str_a)
- for tshirt in (’%s %s’ %(c,s) for c in colors for s in sizes):
- 生成器表达式逐个产出元素,不会一次性产出6个Tshirt样式的列表
-
元组
- 元组除了作为不可变的列表,还可以用于没有字段名的记录
- data = [(‘a’,‘1234’),(‘b’,'2233)]
- _ , filename = os.path.split(’/home/cjl/Desktop/xx.doc)
- 元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。除非我们用*来表示忽略多余的元素
- a , b , *rest = range(5)
- a , *b , c = range(5)
- a , b = b , a 交换变量的值
- collecions.namedtuple() 构建只有少数属性但没有方法的对象,如数据库条目
- Tshirts = collecions.namedtuple(‘Tshirts’ , 'color , size ')
- nike = Tshirts(‘black’ ,‘X’)
-
切片
- 切片和区间操作里不包含区间范围的最后一个元素
- 方便看出元素个数 range(3) mylist[:3]
- 可以利用任意下标划分序列
- s[ : : -1] 反向输出
- l = list(range(10)) l [ 2 : 5 ] = [20,30]
- l [2 : 5] = [100] 不能是 l [2 : 5] = 100
- 赋值的对象是一个切片,赋值语句的右侧必须是可迭代对象
- 切片和区间操作里不包含区间范围的最后一个元素
-
对序列使用 * 和 + 操作,不修改原有的操作对象
- 如果在a*n这个语句中,序列a里的元素是对其他可变对象的引用的话,你就需要格外注意了
- board = [[’?’]*3 for i in range(3)]] [[’?’, ‘?’, ‘?’], [’?’, ‘?’, ‘?’], [’?’, ‘?’, ‘?’]]
- board[1][2] = ‘X’ [[’?’, ‘?’, ‘?’], [’?’, ‘?’, ‘X’], [’?’, ‘?’, ‘?’]]
- wieid_board = [[’?’]*3]*3]] [[’?’, ‘?’, ‘?’], [’?’, ‘?’, ‘?’], [’?’, ‘?’, ‘?’]]
- wieid_board[1][2] = ‘O’ [[’?’, ‘?’, ‘O’], [’?’, ‘?’, ‘O’], [’?’, ‘?’, ‘O’]]
- 列表内的三个引用指向同一个对象
- 可变序列 a*= 2 在原来的对象上修改
- 不可变序列 a*=2 先构建一个新的对象,然后赋值给a 效率很低
- 不要把可变对象放在元组里,会出现错误
- 增量赋值 += 不是一个原子操作
-
排序
- list.sort函数就地排序列表
- sorted 新建一个列表作为返回值
- 两者都有可选的两个关键词 reverse 和 key
- key=len 基于字符串的长度排序
-
bisect管理已排序的序列
- import bisect
- bisect.bisect(haystack,needle) haystack是有序的序列 needle是值 返回的值是位置 needle插入这个位置后 haystacks还是有序的
- bisect.bisect其实是bisect_right函数的别名,bisect_left返回的插入位置 新元素会被放置于它想等的元素的前面
- bisect.bisect 还可以用来查找 根据分数找到对应成绩
- def grade(score,points=[60,70,80,90],grades=‘FDCBA’):
- i = bisect.bisect(points,score)
- return grades[i]
- [grade(score) for score in [33,99,77,89,90]
- bisect.insort(seq,item) 把变量item插入序列seq中,并保持seq升序
-
array.array 产生数组 也是可变序列
-
memoryview 内存视图 能让用户在不复制内容的情况喜爱操作同一个数组的不同切片
-
collections.deque 线程安全、可以快速从两端添加或者删除元素的数据类型
- 对象.rorate(参数) n>0 队列最右边会被移动到最左边
- 对象.appendleft(数据) 在队列左侧添加 数据为队列时 逆序存放
- 对象.extend(数据) 在队列末尾添加
- 对象.popleft()