流畅的python自学笔记(第三章)

可散列类型的定义

如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变 的,而且这个对象需要实现 __hash__() 方法。另外可散列对象还要有 __qe__() 方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的……
这是流畅的python中的原话。
# 一般情况下,用户自己创建的变量都是可散列的
# str,bytes,数值类型如int float doubl等,都是可散列的
# frozenset因定义只能容纳可散列类型,故也可散列
# 元组要看其中元素是否有不可散列的类型
# 例子如下
ff = (1, 2, (3, 4))
f = (2, 3, [1, 4])
hash(f) # 报错
fff = (1, 2, frozenset([3, 4]))
hash(fff) # 正常

字典setdefault

# 字典里面,哎,说实话,书里面举的例子挺好的,不列举了,把重要的说一下
a_dict.setdefault(key, [])

if key not in a_dict:
	a_dict[key] = []
# 两种的功能是一样的,所以可以看出,setdefault函数可以至少简化一次搜索

字典的变种orderedDict

# 如果想要字典的打印,和我们输入的顺序一样,就要用到orderedDict
from collections import OrderedDict
a_dict = OrderedDict()
a_dict["name"] = "LHF"
a_dict["phone_num"] = "1111"
a_dict["love"] = "XYP"

字典的变种counter

from collections import Counter
ct = collections.Counter('abracadabra') 
# 计算这个单词中各个字母的个数,并返回一个字典
print(ct)
# Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}) 输出结果

集合

集合的本质是许多唯一对象的聚类,可以用来去重
给定两个集合 a 和 b
	a | b 返 回的是它们的合集
	a & b 得到的是交集
	而 a - b 得到的是差集
合理地利用这些操作,不仅能够让代码的行数变少,还能减少 Python 程序的运行时间

本章最后的结论

dict 和 set 背后的散列表效率很高
对它的了解越深入,就越能理解为什么被保存的元素会呈现出不同的顺序,以及已有的元素顺序会发生变化的原因。
同时,速度是以牺牲空 间为代价而换来的。
(https://www.cnblogs.com/zhanghongfeng/p/7045536.html)
这篇博客里面有代码进行比较。

猜你喜欢

转载自blog.csdn.net/qq_40994221/article/details/108862202