关于字典
重点知识:
序号 |
函数 | 功能 |
1 | dict() | |
2 | fromkeys() | |
3 | setdegault() | |
4 | pop() | |
5 | popiterm() | |
6 | update() | |
7 | get() | |
8 | clear() | |
9 | del() |
字典是python语言中唯一内建的映射类型。
一个字典对象是可变的,它是一个容器类型,能存储任意个数的python对象。
字典和序列的区别是存储方式和访问数据的方式不同。
字典的键和值之间是相关联的,而序列的索引可以是随机的。
序列类型用有序的数字键做索引将数据以数组的形式索引,一般索引和所存储的数据毫无关系。
映射类型通常被称作hash表,因为字典的对象就是hash类型的。
hash表中存储的每一条数据叫做“值,与它相关的键一起存储。
hash表的算法是获取键,对键执行一个叫做hash函数的操作,并根据计算的结果,选择在数据结构的某个地方来存储值。
任何一个值的存储的地址皆取决于它的键,因为这种随意性,hash表中的值是没有顺序的。
为什么键必须是hash值,因为hash值的不可变性,如果键发生变化,hash值将不能可靠的来存储数据。
1.创建字典和赋值:直接创建、dict()、fromkeys()
>>> info1 = {'name':'kebi','age':25} #直接创建字典 >>> info1 {'name': 'kebi', 'age': 25} >>> info2 = dict([('name','maoxian'),('age',24)]) >>> info2 #从元祖映射 {'name': 'maoxian', 'age': 24} >>> info6 = dict([['gailun','zhaoxin'],['shangdan','daye']]) >>> info6 #从序列映射 {'gailun': 'zhaoxin', 'shangdan': 'daye'} >>> info2 = dict(name = 'xiaoliao',age = 23) >>> info2 {'name': 'xiaoliao', 'age': 23} >>> info4 = {}.fromkeys(('wuhan','xiaogan'),None) >>> info4 #fromkeys也可以创建,理论说不算,因为该函数必须事先存在一个空字典 {'wuhan': None, 'xiaogan': None} >>> info5 = {}.fromkeys(['anlu','yunmeng'],'Hubei') >>> info5 {'anlu': 'Hubei', 'yunmeng': 'Hubei'}
2.赋值:直接赋值、setdefault()
>>> group = {'Top':'xinye','Mid':'xiaoniao'} >>> group {'Top': 'xinye', 'Mid': 'xiaoniao'} >>> group['Jungle'] = 'kebi' >>> group {'Top': 'xinye', 'Mid': 'xiaoniao', 'Jungle': 'kebi'} >>> group {'Top': 'xinye', 'Mid': 'xiaoniao', 'Jungle': 'kebi'} >>> group.setdefault('ADC','maoxian') 'maoxian' >>> group {'Top': 'xinye', 'Mid': 'xiaoniao', 'Jungle': 'kebi', 'ADC': 'maoxian'}
如果需要添加的值已经存在,则不变 >>> info {'name': 'kebi', 'age': 25} >>> info.setdefault('name','maoxian') 'kebi' >>> info {'name': 'kebi', 'age': 25}
还有一个update可以用来进行赋值。
update:将一个字典中的键值对全部加入到另一个字典中。如果键存在重复,则会更新旧的值。
>>> info {'name': 'kebi', 'sex': 'man'} >>> ad = {'age':25} >>> info.update(ad) >>> info {'name': 'kebi', 'sex': 'man', 'age': 25} #合并赋值 >>> ad1 = {'name':'maoxian','like':'woman'} >>> info.update(ad1) >>> info {'name': 'maoxian', 'sex': 'man', 'age': 25, 'like': 'woman'} #更新合并 >>> KeyboardInterrupt
3.访问:通过键访问、get()
>>> group['ADC'] #直接访问,没有就会报错 'maoxian' >>> group.get('ADC') #get不错,还不会报错 'maoxian'
>>> info.get('age','not in') #可以指定返回值 'not in'
>>> group.keys() #查键 dict_keys(['Top', 'Mid', 'Jungle', 'ADC']) >>> group.values() #查值 dict_values(['xinye', 'xiaoniao', 'kebi', 'maoxian'])
4.删除元素或者字典:del、pop()、popitem()、clear()
{'Top': 'xinye', 'Mid': 'xiaoniao', 'Jungle': 'kebi', 'ADC': 'maoxian'} >>> del group['ADC'] #删除指定键值对 >>> group {'Top': 'xinye', 'Mid': 'xiaoniao', 'Jungle': 'kebi'} >>> group.popitem() #删除最后一个键值对,不能指定删谁 ('Jungle', 'kebi') >>> group {'Top': 'xinye', 'Mid': 'xiaoniao'} >>> group.pop('Top') #必须指定要删的对象,还可以指定查不到值时返回的信息,没有指定就会报错。 'xinye' >>> group {'Mid': 'xiaoniao'}
>>> info {'name': 'kebi', 'sex': 'man'} >>> info.pop('age') Traceback (most recent call last): File "<stdin>", line 1, in <module> #没有值就会报错 KeyError: 'age' >>> info.pop('age',None) #指定查找不到,不返回值 >>> info.pop('age','Error') #指定返回值 'Error'
>>> group {'Mid': 'xiaoniao', 'ADC': 'xinxin'} >>> group.clear() #清空字典 >>> group {}
>>> group {'ADC': 'xinxin', 'sup': None} >>> del group #彻底删除 >>> group Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'group' is not defined
5.相关知识
>>> print("%(name)s is %(position)s" %info) #字典作为被格式化的对象 kebi is Jungle >>> print("%(position)s is %(name)s" %info) Jungle is kebi #需要指定键值
字典中的键有两条是必须要遵守的:
(1)不允许一个键对应多个值
(2)键必须是可hash的
>>> group = {'Top':'kebi','Top':'huagu'} >>> group {'Top': 'huagu'}
puthon并不会因为字典中的键存在冲突就产生错误。这样做是为了节省内存。
最后补充一点:字典也是可以嵌套的的。