第11章 字典
字典是python最好的语言特性之一,是很多高效算法的基本构建块。
11.1 字典是一种映射
字典类似于列表,但是下标不一定是整数,字典的下标又称为键,每个键都与一个值关联。
键值对(key-value pair):字典的一个下标与值之间的关联,每对键值对称为一项(item)
eng2sp = dic() # 创建字典
eng2sp
#输出
{}
{}
表示空字典
# 添加新的item
eng2sp['one'] = 'uno'
eng2sp['two'] = 'sjg'
eng2sp
{'one':'uno','two','sjg'}
- 字典没有顺序,键值对内部用
:
分割,键值对之间用,
分割。
len()
:返回键值对的数量
len(eng2sp)
in()
:判断一个值是否存在字典的键中
python对于字典的底层算法采用哈希表数据结构,单次查找的时间复杂度为O(1)
11.2 使用字典作为计数器集合
def histogram(s):
d = dict()
for c in s :
if c not in d:
d[c] = 1
else:
d[c]+= 1
return d
h = histogram('shiueguaosj')
print(h)
>>>{'s': 2, 'h': 1, 'i': 1, 'u': 2, 'e': 1, 'g': 1, 'a': 1, 'o': 1, 'j': 1}
dic.get()
11.3 循环和字典
在for
循环中使用字典,会遍历字典的键
eg. 通过遍历字典的键返回字典的值
def print_hist(dic):
for c in dic:
print(c, dic[c])
print_hist(h)
11.4 反向查找
在处理大的字典过程中,反向查找对于程序的性能影响很大
正向查找:根据字典的键返回字典的值
v = d[k]
反向查找函数:
def reverse_lookup(d, v):
for k in d:
if d[k] == v:
return k
raise LookupError()
LookupError()
:内置异常,用来表示查找操作失败,也可以接受一个可选参数描述错误。egraise LookupError('value does not appear')
11.5 反转字典
为了避免反转后存在1个key对应多个val情况,反转后每一项的值都应该是一个列表
散列(hash):是一个函数,接收任意类型的值并返回一个整数。字典使用这些散列值,也就是整数查找键值对。
- 列表可以是val,不能是key;
def invert_dict(d):
# new dic
inverse = dict()
for key in d:
val = d[key]
if val not in inverse:
inverse[val] = [key]
else:
inverse[val].append(key)
defaultdict模块
from collections import defaultdict
是Python中导入collections
模块中的defaultdict
类的语句。
defaultdict
是collections
模块中的一个类,它是dict
的一个子类,提供了一种默认值的机制。与普通的dict
不同,当访问一个不存在的键时,defaultdict
会自动创建一个默认值,并将其作为该键的值返回。
使用defaultdict
可以避免在访问字典中不存在的键时引发KeyError
异常,可以在创建defaultdict
对象时指定一个默认值的类型,当访问不存在的键时,会自动创建该类型的默认值。
from collections import defaultdict
my_dict = defaultdict(int)
print(my_dict['key1'])