可散列类型的定义
如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变 的,而且这个对象需要实现 __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)
这篇博客里面有代码进行比较。