一、定义
字典属于任凭其对象,是无序的 键:值(key:value
)对集合
键可以是python中任意不可变数据(整数、浮点数、字符串、元组等),但不能是可变数据(列表、字典)或包含可变元素的不可变数据(如包含列表的元组等)。同一个字典内的键不允许重复,值允许重复
字典 定义语法为{元素1,元素2,元素3, ... ,元素n}
- 其中每一个元素是一个「键值对」-- 键:值 (
key:value
) - 关键点是「大括号 {}」,「逗号 ,」和「冒号 :」
- 大括号 -- 把所有元素绑在一起
- 逗号 -- 将每个键值对分开
- 冒号 -- 将键和值分开
字典的特征:
dict
内部存放的顺序和key
放入的顺序是没有关系的,所以没有下标取元素一说。dict
查找和插入的速度极快,不会随着key
的增加而增加,但是需要占用大量的内存。
二、字典的创建
1.直接大括号{}创建
通过字符串或数值作为key
来创建字典。
dic1 = {1:'1',2:'2',3:'3',4:'4'} #用整数和字符串作为字典的键和值
print(dic1)
print(dic1[1])
print(dic1[4])
print('='*30)
dic2 = {(1, 2, 3): "A", "B": 12, 3: [3, 5, 7]} #用元组作为键来创建字典,可行但一般不用
print(dic2)
print(dic2[(1,2,3)])
'''
{1: '1', 2: '2', 3: '3', 4: '4'}
1
4
==============================
{(1, 2, 3): 'A', 'B': 12, 3: [3, 5, 7]}
A
'''
*注意:上图的dic1[1]等语句不是用下标取元素,而是用键取值,输入的键不在字典中时会报错v
2.dict()创建字典
- dict(**kwargs) **kwargs -- 关键字
- dict(mapping) mapping -- 元素的容器,映射类型
通过key
直接把数据放入字典中,但一个key
只能对应一个value
,多次对一个key
放入 value
,后面的值会把前面的值冲掉。也可以将mapping对象转换为字典类型数据
#dict()形式
dic_1 = dict() #创建空字典
#dict(*kwargs)形式
dic_2 = dict(name='张三', age=18, sex='M') #等号连接键和值
dic_3 = dict(a=1, b='b', t='t') #键只能为字符串类型,并且创建的时候字符串不能加引号
#dict(mapping)形式
dic_4 = dict([(1,'1'),(2,'two'),(3,'3')])
dic_5 = dict(((1,2),(3,'4')))
dic_6 = dict(zip('abcd',[1,2,3,4]))
print(dic_1)
print(dic_2)
print(dic_3)
print(dic_4)
print(dic_5)
print(dic_6)
'''
{}
{'name': '张三', 'age': 18, 'sex': 'M'}
{'a': 1, 'b': 'b', 't': 't'}
{1: '1', 2: 'two', 3: '3'}
{1: 2, 3: '4'}
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
'''
3.内置方法创建
dict.fromkeys(seq[,value])
用于创建一个新字典,以序列 seq
中元素做字典的键,value
为字典所有键对应的初始值。
data1 = dict.fromkeys([1, 2, 3, 4]) #以指定数据为键,值为空
data2 = dict.fromkeys([1,2,3,4],'初始值')
print(data1)
print(data2)
'''
{1: None, 2: None, 3: None, 4: None}
{1: '初始值', 2: '初始值', 3: '初始值', 4: '初始值'}
'''
三、字典元素的访问
1.把键作为下标直接访问
dic_1 = {'第一个':'1','第二个':2,'第三个':'3'}
dic_1['第三个'] # '3'
2.获取键对应的值
- dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回默认值。
- dict.setdefault(key, default=None) 和 get() 方法类似
get()方法用来获取键对应的值,如果键不存在,get()方法会返回空值或指定的值
dic = dict(name='张三',age=18,sex='M')
print(dic.get('name'))
print(dic.get(''))
print(dic.get('2','不存在'))
print(dic.setdefault('5','None~')) #同get()
'''
张三
None
不存在
None~
'''
3.获取字典所有的键/值
- dict.keys() 获取字典所有的键
- dict.values() 获取字典所有的值
- dict.items() 获取字典所有的元素
dic = dict(name='张三',age=18,sex='M')
print(dic.keys()) #dic.keys()返回字典所有键
print(dic.values()) #dic.values()返回字典所有值
print(dic.items()) #dic.items()返回字典所有元素
for key,value in dic.items():
print(key,value,sep='\t')
'''
dict_keys(['name', 'age', 'sex'])
dict_values(['张三', 18, 'M'])
dict_items([('name', '张三'), ('age', 18), ('sex', 'M')])
name 张三
age 18
sex M
'''
四、字典元素的修改
1.指定键为下标赋值
当指定的键存在于原字典时,修改该键对应的值;如果指定的键不存在时,表示添加一个元素
dic = dict(name='张三',age=18,sex='M')
dic['name'] = '李四' #修改已有元素的值
dic['number'] = 10 #添加的元素
print(dic)
'''
{'name': '李四', 'age': 18, 'sex': 'M', 'number': 10}
'''
2.dict.update()
update()方法可以将另一个字典的元素一次性全部添加到当前字典中,如果两个字典中存在相同的键,则以另一个字典中的值为准,对当前字典进行更新
dic = dict(name='张三',age=18,sex='M')
dic.update({'name':'李四','age':20})
print(dic)
dic.update({'number':10,'home':None})
print(dic)
'''
{'name': '李四', 'age': 20, 'sex': 'M'}
{'name': '李四', 'age': 20, 'sex': 'M', 'number': 10, 'home': None}
'''
3.删除元素
- dict.pop(key[,default]) 删除给定键
key
所对应的值并返回。若key
不存在,则回default
值。 - dict.popitem() 随机返回并删除字典中的一对键和值,若字典已空则报错
- del dict[key] 删除给定键
key
所对应的值 - dict.clear() 删除字典内所有元素。
dic = dict(name='张三',age=18,sex='M',home='None')
dic.pop('name')
print(dic.pop('number','不存在该键'))
print(dic)
dic.popitem()
print(dic)
del dic['sex']
print(dic)
dic.clear()
print(dic)
'''
不存在该键
{'age': 18, 'sex': 'M', 'home': 'None'}
{'age': 18, 'sex': 'M'}
{'age': 18}
{}
'''
4.复制字典
dict.copy() 返回一个字典的浅复制,父对象(一级目录),子对象(二级目录,如字典中的列 表、元组等)不拷贝,还是引用
#dict.copy() 返回一个字典的浅复制。
dic = {1:'1',2:'2',3:[1,2,3]}
dic_1 = dic #引用
dic_2 = dic.copy() #浅拷贝
print(id(dic) == id(dic_1))
print(id(dic) == id(dic_2))
dic[1] = '0' #dic一级目录改变,dic_1改变,dic_2不变
dic[3][0] = 0 #dic二级目录改变,dic_1和dic_2均改变
print(dic_1)
print(dic_2)
'''
True
False
{1: '0', 2: '2', 3: [0, 2, 3]}
{1: '1', 2: '2', 3: [0, 2, 3]}
'''