字典(dict):
Python内置了字典,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,查找速度是极快的。
举栗子:
假设要根据同学的名字查找对应的成绩,使用列表实现,则需要两个列表:
names = ['zhangsan','lisi','wanger']
scores = [85,56,84]
当给出一个名字,要查找对应的成绩时,需现在names中找到对应的位置,再从scores取出相应的成绩,列表越长耗时越长。
用字典方式实现名字和成绩的查询:
>>>c = {'zhangsan':77,'lisi':64,'wanger':34}
>>>c = ['zhangsan']
77
>>>
dict的查询方式类似新华字典,现在字典的(例如部首表里)查找该字的对应页码,直接找到该页即可。它通过key直接找到value所在的内存地址,因此速度很快,而在list中。查找的方式类似一页一页的翻字典, list越长,耗时越长。
一个key只能对应一个value,多次对一个key存入value,会替换掉原来的value
如果key不存在,dict会提示KeyError。
要避免key不存在的错误,有两种办法,其一,通过in判断key是否存在:
>>>'wanger' in d
False
>>>
其二:通过dict提供的get()方法,如果key不存在,可以返回None,或者自行指定的value
>>>d.get('mazi') #返回None的时候python的交互环境不显示结果
>>>d.get('mazi',无该值)#显示指定的value
无该值
>>>d.get('lisi')#如果key存在,显示该key对应的value
88
要删除一个key,用pop(key)方法,对应的value也会从字典删除
>>>d.pop('lisi')
88
>>>d
{'zhangsan':55}#李四和对应的值被删除
注意:dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
1,查找和插入速度极快,不会随key的增加而变慢。
2,需要占用大量内存,内存消耗大。
以上两点正好和list相反,
1,查找和插入的时间随着元素的增加而增加。
2,占用空间小,内存浪费也少。
因此,dict是用空间来换取时间的一种方法。
dict用在高速查找的很多地方,在python代码中无处不在。正确使用dict非常重要需要牢记的第一条是dict的key必须是不可变对象。
dict根据key来计算value的存储位置,所以每次计算相同的key得出的结果必须一样,通过key计算位置的算法为哈希算法(hash)。
为保证哈hash的正确性,作为key的对象不可变,在python中,字符串,整数等都为不可变对象,因此可以作为key,而list是可变的,就不能作为key。
练习:
1. 现有一个字典dict1 保存的是小写字母a-z对应的ASCII码
dict1 = {'a': 97, 'c': 99, 'b': 98, 'e': 101, 'd': 100, 'g': 103, 'f': 102, 'i': 105, 'h': 104, 'k': 107, 'j': 106, 'm': 109, 'l': 108, 'o': 96, 'n': 110, 'q': 113, 'p': 112, 's': 115, 'r': 114, 'u': 117, 't': 116, 'w': 119, 'v': 118, 'y': 121, 'x': 120, 'z': 122}
1) 将该字典按照ASCII码的值排序
答:sorted(dict1.items(),key=lambda item:item[1])
2) 有一个字母的ASCII错了,修改为正确的值,并重新排序
答:dict1['o']=111→sorted(dict1.items(),key=lambda item:item[1])
2. 用最简洁的代码,自己生成一个大写字母 A-Z 及其对应的ASCII码值的字典dict2(使用dict,zip,range方法)
答:>>>import string
>>>dict(zip(string.uppercase,range(065,92)))
{'A': 65, 'C': 67, 'B': 66, 'E': 69, 'D': 68, 'G': 71, 'F': 70, 'I': 73, 'H': 72, 'K': 75, 'J': 74, 'M': 77, 'L': 76, 'O': 79, 'N': 78, 'Q': 81, 'P': 80, 'S': 83, 'R': 82, 'U': 85, 'T': 84, 'W': 87, 'V': 86, 'Y': 89, 'X': 88, 'Z': 90}
>>>dict2=dict(zip(string.uppercase,range(65,92)))
3. 将dict2与第一题排序后的dict1合并成一个dict3
>>>dict3=dict1.copy()
>>>dict3.update(dict2)
##############################