今天写对于 这本书第三章的回顾
1.可散列的数据类型
原子不可变数据类型(数值,str)都是可散列的
元组只有它所有元素是可散列的它才是散列的
什么叫可散列的数据类型?
1.要能实现hash方法,且每次Hash出来的值是一样的
2.要能实现eq方法,a==b为true 时散列值也想等
2.创建字典有很多种方法
介绍几种不常见的
a = dict(one = 1)
b = dict(zip(['one'],[1]))
c = dict({'one':1})
d = dict([('one',1)])
3.字典推导式
a = {b:c for b,c in L}
4.多种不同的映射方法
这里尝试实验一下字典的update方法
d = {'one':3,'two':4}
d.update(zip(['one', 'two'], [1, 2]))
print(d)
结果确实改变了
用setdefault 处理找不到的键可极大的简化代码
稍微解释一下代码
occurreces = index.get(word, [])
从index这个字典里找一个单词,找不到返回空列表
occurences.append(location)
在occurences 中加入我们现在找到的坐标
index[word] = occurences
重新赋值
用setdefault就会非常方便
index.setdefault(word,[]).append(location)
先尝试获取word在index里的值,不存在就会自动建立一个空列表对应这个word,并返回那个空列表的引用。
所以我们就可以直接append了,
无论word存不存在
这个setdefault是返回这个我们设定的默认值的引用
但defaultdict不同,它会在你执行dd['new-key'] = default value
dd = defaultdict(list)
print(dd['one'])
'one'是dd里没有的键,这样的结果会是一个空列表
defaultdict的这种功能是通过default_factory实现的
同时不能忽略__missing__
它会在你字典找不到对应值的时候调用
记住,missing 只会被getitem调用
接下来我们来实现一个在查询时既接受数字查询又接受字符串查询的字典
class StrKeyDict1(dict):
def __missing__(self, key):
if isinstance(key, str):
raise KeyError(key)
return self[str(key)]
def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default
def __contains__(self, key):
return key in self.keys() or str(key) in self.keys()
raise KeyError就是像递归停止条件一样,必须要有,否则回陷入无限递归!
key in dict 会调用__contains__,若这样写同样陷入无限递归
key in dict.keys()不会调用__contains__