关于字典

重点知识:

序号

函数                                功能
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并不会因为字典中的键存在冲突就产生错误。这样做是为了节省内存。

最后补充一点:字典也是可以嵌套的的。

原文地址:https://www.cnblogs.com/yangmingxianshen/p/7707601.html