第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():内置异常,用来表示查找操作失败,也可以接受一个可选参数描述错误。eg

raise 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类的语句。

defaultdictcollections模块中的一个类,它是dict的一个子类,提供了一种默认值的机制。与普通的dict不同,当访问一个不存在的键时,defaultdict会自动创建一个默认值,并将其作为该键的值返回。

使用defaultdict可以避免在访问字典中不存在的键时引发KeyError异常,可以在创建defaultdict对象时指定一个默认值的类型,当访问不存在的键时,会自动创建该类型的默认值。

from collections import defaultdict
my_dict = defaultdict(int)
print(my_dict['key1'])