风火编程--python的集合set和字典dict的特性

版权声明:风火编程, 欢迎指正. https://blog.csdn.net/weixin_42620314/article/details/84038364

《流畅的python》读书笔记(二)

第3章 字典和集合

3.1 散列
可散列对象应实现了: hash()和__eq__()方法
原子类型的数据可散列,
不可变集合可散列,
元组只有当所有元素可散列的时候才是可散列的

3.3 字典的操作

a = d.get("4", 4)
# 如果键不存在,添加并返回默认值
b = d.setdefault("5", 1)
# 删除并返回键对应的值,如果键不存在返回默认值
c = d.pop("6", 3)
# 删除并返回最后一个加入的键对应的键值对
e = d.popitem()
f = d.popitem()
print(d, a, b, c, e, f)

3.5映射链ChainMap

 from collections import ChainMap
    d1 = {}.fromkeys("1239", 0)
    dd = ChainMap(d1, d)
# 用法同字典,会从前开始查找键,找到为止.
print(dd.keys())

计数器Counter

from collections import Counter
s = "122333"
ct = Counter(s)
print(ct)
m = ct.most_common(2)
print(m)
# 动态统计
ct.update("1234")
print(ct)
print(ct.most_common(2))

3.7 不可变映射

from types import MappingProxyType
d = dict(one=1,two=2,three=3)
p = MappingProxyType(d)
print(p)
d["one"] = "one"
print(p)

# 对代理进行修改会报错
p["one"] = 1

只有set序列可以做减法, 但是set不能做加法

3.8 集合论
空集合用set()表示

# difference()求多个集合的补集
s = set("123456")
seq1 = "123"
seq2 = "0451"
# r = s-set(seq1)-set(seq2)
r = s.difference(seq1,seq2)
print(r)
# update()求多个集合的并集
r = s.update(seq1,seq2)
print(r, s)  # 集合可变,没有返回值

3.9 底层知识
对set和dict.keys()进行in检查时,元素的个数对运算效率几乎没有影响

set和dict.keys是散列表(稀疏 数组), 每个元素都是以表元的形式存储, 每个表元包括建和值的引用.每个表元大小一致, 可以通过偏移量来读取.python会保证1/3的表元作为扩展空间, 达到阈值后会将数据复制到更大的内存空间.

散列表查询速度快,但是空间开销巨大. 自定义的类中可以通过指定__slots__将实例属性的存储方式从字典改成元组.

dict.keys()是有顺序的, 顺序是key的添加顺序, 但是不能通过索引取值, 可以先用list()转成列表.
向字典中添加新元素的时候如果发生散列冲突, 则会改变原有键的顺序, 因此不能在迭代中修改字典.应该先放入新的字典, 迭代结束后再更新. set()与dict,keys()相同

dict.items()/dict.keys()/dict.values()都是字典视图,是动态同步的,但是不能主动修改.

3.10 创建字典视图

from type import MappingProxyType
dv = MappingProxyType(dict)

猜你喜欢

转载自blog.csdn.net/weixin_42620314/article/details/84038364
今日推荐