目录
1:字典的定义及特性
2:常用字典字面量及操作
2.1常用字典字面量及操作汇总
2.3字典的增删改查
2.3.1:字典的增加操作:
2.3.2:字典的删除操作:
2.3.3:字典的修改操作:
2.3.4:字典的查询操作:
2.4 字典的拷贝
2.5 字典的其他常用操作
2.5.1:判断某个key是否存在
2.5.1:字典的遍历
1:字典的定义及特性
字典是一种无序集合的可变数据类型,它以{} 来表示,使用逗号来隔开,内部元素使用键值对(key:value)来存储对象,key必须是不可变的数据类型,value可以是任何类型的数据类型。
字典具有如下特性:
A:任意对象的无序集合,它可变长度,能够任意嵌套。
B:可通过键来访问。
C:属于“可变映射”类型。
D:字典是对象引用表(与列表一样,字典存储的也是对象引用)
2:常用字典字面量及操作
2.1常用字典字面量及操作汇总
操作 | 说明 | 示例 | 结果 |
D={} | 空字典 | | |
D={‘name’:’ixusy88’,’age’:18} | 有两个元素的字典 | | |
D={‘ceo’:{‘name’:’ixusy88’,’age’:18} } | 字典嵌套 | | |
D = dict(name=’ixusy88’,age=18) | 构造方法:关键字 | D = dict(name='ixusy88',age=18) print(D) | {'name': 'ixusy88', 'age': 18} |
D=dict([(‘name’,’ixusy88’),(‘age’,18)]) | 键值对 | D=dict([('name','ixusy88'),('age',18)]) print(D) | {'name': 'ixusy88', 'age': 18} |
D=dict(zip(keylist,valslist)) | 拉链试键值对 | keylist = ['name','age'] valslist = ['ixusy88',18] D=dict(zip(keylist,valslist)) print(D) | {'name': 'ixusy88', 'age': 18} |
D=dict.fromkeys([‘a’,’b’]) | 键列表 | D=dict.fromkeys(['a','b']) print(D) | {'a': None, 'b': None} |
D[‘name’] | 键索引访问 | D={'name':'ixusy88','age':18} print(D['name']) | ixusy88 |
D[‘ceo’][‘age’] | 嵌套索引 | D={'ceo':{'name':'ixusy88','age':18}} print(D['ceo']['age']) | 18 |
age in D | 成员关系:键存在测试 | D={'name':'ixusy88','age':18} if 'name' in D: print('name in D') else: print('name not in D') | name in D |
D.keys() | 方法:所有键 | D={'name':'ixusy88','age':18} print(D.keys(),list(D.keys())) | dict_keys(['name', 'age']) ['name', 'age'] |
D.values() | 方法:所有值 | D={'name':'ixusy88','age':18} print(D.values(),list(D.values())) | dict_values(['ixusy88', 18]) ['ixusy88', 18] |
D.items() | 所有”键+值”元组 | D={'name':'ixusy88','age':18} print(D.items(),list(D.items())) for k,v in D.items(): print(k,v) | dict_items([('name', 'ixusy88'), ('age', 18)]) [('name', 'ixusy88'), ('age', 18)] name ixusy88 age 18 |
D.copy() | 拷贝(顶层的) | D={'ceo':{'name':'ixusy88','age':18}} D2 = D.copy() print(D,D2) # D.copy()只是顶层拷贝,嵌套的字典,还是公共的。 # 修改D2,也会影响到D D2['ceo']['name'] = '9999' print(D,D2) | {'ceo': {'name': 'ixusy88', 'age': 18}} {'ceo': {'name': 'ixusy88', 'age': 18}} {'ceo': {'name': '9999', 'age': 18}} {'ceo': {'name': '9999', 'age': 18}} |
D.clear() | 清空 | D={'name':'ixusy88','age':18} print(D) D.clear() print(D) | {'name': 'ixusy88', 'age': 18} {} |
D.update(D2) | 通过键合并 | D={'name':'ixusy88','age':18} D2={'abc':123} D.update(D2) print(D,D2) | {'name': 'ixusy88', 'age': 18, 'abc': 123} {'abc': 123} |
D.get(key,default) | 通过键获取,如果不存在返回默认值。 | D={'name':'ixusy88','age':18} print(D.get('age',0)) print(D.get('aaa',0)) | 18 0 |
D.pop(key,default) | 通过键删除,如果不存在返回默认值,存在返回对应的value | D={'name':'ixusy88','age':18} print(D.pop('age',0)) print(D) print(D.pop('aaaa','不存在')) print(D) | 18 {'name': 'ixusy88'} 不存在 {'name': 'ixusy88'} |
D.setdefault(key,default) | 通过键获取,如果不存在就先添加,再返回value;如果存在就不会做添加操作,直接返回value值 | D={'name':'ixusy88','age':18} print(D.setdefault('age',100)) print(D) print(D.setdefault('aaa',88)) print(D) | 18 {'name': 'ixusy88', 'age': 18} 88 {'name': 'ixusy88', 'age': 18, 'aaa': 88} |
D.popitem() | 删除并返回一个键值对;如果是一个空的字典,执行此操作会报错。 | D={'name':'ixusy88','age':18} print(D.popitem()) print(D) print(D.popitem()) print(D) print(D.popitem()) | ('age', 18) {'name': 'ixusy88'} ('name', 'ixusy88') {} Traceback (most recent call last): File "D:\python\字典.py", line 108, in <module> print(D.popitem()) KeyError: 'popitem(): dictionary is empty' |
len(D) | 长度(键值对的对数),顶层的 | D={'name':'ixusy88','age':18,'aaa':{'bbb':123}} print(len(D)) | 3 |
D[key] = 88 | 新增或修改键对应的值 | D={'name':'ixusy88','age':18} D['aaa'] = 88 print(D) | {'name': 'ixusy88', 'age': 18, 'aaa': 88} |
del D[key] | 根据键删除,删除不存在的key会报错 | D={'name':'ixusy88','age':18} del D['age'] print(D) # del D['age_11'] | {'name': 'ixusy88'} |
list(D.keys()) | 查看字典键 | D={'name':'ixusy88','age':18} print(list(D.keys())) | ['name', 'age'] |
D1.keys() & D2.keys() | 查看2个字典相同的键 | D1={'name':'ixusy88','age':18} D2={'aaa':123,'age':19} print( D1.keys() & D2.keys() ) print( D1.keys() | D2.keys() ) print( D1.keys() ^ D2.keys() ) | {'age'} {'name', 'age', 'aaa'} {'name', 'aaa'} |
D = {x:x*2 for x in range(10) } | 字典推导 | D = {x:x*2 for x in range(3) } print(D) | {0: 0, 1: 2, 2: 4} |
查看更多方法及使用说明 使用下面语句查看:
#print(dir(dict))
print([item for item in dir(dict) if not item.startswith('__') ])
#print(help(dict))
2.3字典的增删改查
字典也是可变数据类型,因此可以进行增删改操作:
2.3.1:字典的增加操作:
dic = {} # 或者 dic = dict()
# 1: 直接用key 往里面存数据即可,
# 如果不存在key值就添加,如果存在就更新key对应的值;
dic['刘德华'] = '马桶' # 直接用key 往里面存数据即可
dic['王宝强'] = '天下无贼'
print('1---:',dic) # 输出 {'刘德华': '马桶', '王宝强': '天下无贼'}
dic['王宝强'] = '士兵突击' # 如果key值存在,那么会替换掉原来的value
print('2---:',dic) # 输出 {'刘德华': '马桶', '王宝强': '士兵突击'}
# 2:setdefault(),如果不存在就添加,返回value值;如存在就不做增加处理,返回原来的value值
value = dic.setdefault('黄秋生', '头文字D')
print('3---:',value) # 头文字D
print('4---:',dic) # {'刘德华': '马桶', '王宝强': '士兵突击', '黄秋生': '头文字D'}
value = dic.setdefault('黄秋生', '无间道') # 如果存在了key,不会执行增加操作,
print('5---:',value) # 头文字D
print('6---:',dic) # {'刘德华': '马桶', '王宝强': '士兵突击', '黄秋生': '头文字D'}
"""
输出结果:
1---: {'刘德华': '马桶', '王宝强': '天下无贼'}
2---: {'刘德华': '马桶', '王宝强': '士兵突击'}
3---: 头文字D
4---: {'刘德华': '马桶', '王宝强': '士兵突击', '黄秋生': '头文字D'}
5---: 头文字D
6---: {'刘德华': '马桶', '王宝强': '士兵突击', '黄秋生': '头文字D'}
"""
2.3.2:字典的删除操作:
# 1: pop,指定 key值删除
# dic.pop("a",'无key默认返回值') # pop根据key删除键值对,并返回对应的值,如果没有key则返回默认返回值
dic = {"黄日华": "天龙八部", "苏有朋": "倚天屠龙记", "王宝强": "天下无贼" }
value = dic.pop('王宝强') # key存在,并返回key对应的value
print('1---:',value) # 天下无贼
print('2---:',dic) # {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记'}
dic = {"黄日华": "天龙八部", "苏有朋": "倚天屠龙记", "王宝强": "天下无贼" }
# dic.pop('刘德华') # key值不存在,这样删除会报错, KeyError: '刘德华'
# 删除时指定默认的返回值
value = dic.pop('刘德华',None) # 这样删除不会报错
print('3---:',value) # None
print('4---:',dic) # {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记', '王宝强': '天下无贼'}
# 2: popitem() 随机删除,返回被删除的键值对;字典中需要有元素,不然会报错。
dic = {"黄日华": "天龙八部", "苏有朋": "倚天屠龙记", "王宝强": "天下无贼" }
dic.popitem() # 随机删除
print('5---:',dic)
# 3: del,key值需要存在,不然会报错
dic = {"黄日华": "天龙八部", "苏有朋": "倚天屠龙记", "王宝强": "天下无贼" }
del dic['苏有朋'] # 删除存在的key值,
print('6---:',dic)
#del dic['苏有朋'] # 删除不存在的key,报错, KeyError: '苏有朋'
#print(dic)
# 4:clear() 清空字典
dic = {"黄日华": "天龙八部", "苏有朋": "倚天屠龙记", "王宝强": "天下无贼" }
dic.clear() # 清空字典
print('7---:',dic)
"""
1---: 天下无贼
2---: {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记'}
3---: None
4---: {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记', '王宝强': '天下无贼'}
5---: {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记'}
6---: {'黄日华': '天龙八部', '王宝强': '天下无贼'}
7---: {}
"""
2.3.3:字典的修改操作:
# 更新(修改):
# 通过键值去更新
dic = {"黄日华": "天龙八部", "苏有朋": "倚天屠龙记", "刘德华": "马桶", "王宝强": "天下无贼" }
dic['刘德华'] = '无间道' # key不存在就添加,key存在就更新
print('1---',dic)
# update更新
dic2 = {'刘能': '乡村爱情', '王宝强': '士兵突击'}
dic.update(dic2) # 将dic2所有的键值对覆盖添加(相同的覆盖,没有的添加)到dic中
print('2---',dic)
print('3---',dic2)
"""
1--- {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记', '刘德华': '无间道', '王宝强': '天下无贼'}
2--- {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记', '刘德华': '无间道', '王宝强': '士兵突击', '刘能': '乡村爱情'}
3--- {'刘能': '乡村爱情', '王宝强': '士兵突击'}
"""
2.3.4:字典的查询操作:
# 查询(获取元素)
dic = {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记', '刘德华': '无间道', '王宝强': '士兵突击', '刘能': '乡村爱情'}
#1:最直观。直接用key
print('1----',dic)
print("2----dic['苏有朋']=",dic['苏有朋']) # 没有key值会报错
#print(dic['苏有朋3']) # KeyError: '苏有朋3'
#2:get方法,不存在返回None
print("3----dic.get('黄日华')=",dic.get('黄日华'))
print("4----dic.get('黄日华2')=",dic.get('黄日华2')) # 不存在返回 None
print("5----dic.get('黄日华3', 'haha不存在')=",dic.get('黄日华3', 'haha不存在')) # 第二个参数,不存在的时候,默认的返回值
"""
1---- {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记', '刘德华': '无间道', '王宝强': '士兵突击', '刘能': '乡村爱情'}
2----dic['苏有朋']= 倚天屠龙记
3----dic.get('黄日华')= 天龙八部
4----dic.get('黄日华2')= None
5----dic.get('黄日华3', 'haha不存在')= haha不存在
"""
2.4 字典的拷贝
print('***变量赋值:','*'*60)
# 1:变量赋值,没有实现拷贝,两个变量都是指向同一个对象。
dic1 = {'刘能': '乡村爱情', '王宝强': '士兵突击'}
dic2= dic1 # 变量赋值,dic1,dic2都指向了相同的对象
print('1-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('1-2---:dic2=',dic2,'id(dic2)=',id(dic2))
dic1['刘能'] = '刘老根Ⅱ' # 赋值之后,修改了共同的对象
print('2-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('2-2---:dic2=',dic2,'id(dic2)=',id(dic2))
print('***dict() 构造函数:','*'*60)
# 使用dict() 构造函数拷贝,只是拷贝顶层的
dic1 = {'刘能': '乡村爱情', '王宝强': '士兵突击','ceo':{'name':'ixusy88','age':18}}
dic2 = dict(dic1) # 拷贝了一份副本
print('3-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('3-2---:dic2=',dic2,'id(dic2)=',id(dic2))
dic1['刘能'] = '刘老根Ⅱ' # 赋值之后 ,只改变dic1指向的对象,对dic2指向的对象没有影响。
dic2['ceo']['age'] = 19 # 里面嵌套的字典还是共有的,赋值之后对两个都有影响。
print('4-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('4-2---:dic2=',dic2,'id(dic2)=',id(dic2))
print('***dict.copy() 构造函数:','*'*60)
# 使用dict() 构造函数拷贝,只是拷贝顶层的
dic1 = {'刘能': '乡村爱情', '王宝强': '士兵突击','ceo':{'name':'ixusy88','age':18}}
dic2 = dic1.copy()
print('5-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('5-2---:dic2=',dic2,'id(dic2)=',id(dic2))
dic1['刘能'] = '刘老根Ⅱ' # 赋值之后 ,只改变dic1指向的对象,对dic2指向的对象没有影响。
dic2['ceo']['age'] = 19 # 里面嵌套的字典还是共有的,赋值之后对两个都有影响。
print('6-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('6-2---:dic2=',dic2,'id(dic2)=',id(dic2))
print('***使用深度拷贝:','*'*60)
# 深度拷贝,需要引入一个模块
import copy
dic1 = {'刘能': '乡村爱情', '王宝强': '士兵突击','ceo':{'name':'ixusy88','age':18}}
dic2 = copy.deepcopy(dic1) # 完全拷贝了一份,包括里面嵌套的
print('7-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('7-2---:dic2=',dic2,'id(dic2)=',id(dic2))
dic1['刘能'] = '刘老根Ⅱ' # 赋值之后 ,只改变dic1指向的对象,对dic2指向的对象没有影响。
dic2['ceo']['age'] = 19 # 赋值之后 ,只改变dic2指向的对象,对dic1指向的对象没有影响。
print('7-1---:dic1=',dic1,'id(dic1)=',id(dic1))
print('7-2---:dic2=',dic2,'id(dic2)=',id(dic2))
"""
***变量赋值: ************************************************************
1-1---:dic1= {'刘能': '乡村爱情', '王宝强': '士兵突击'} id(dic1)= 1781472941112
1-2---:dic2= {'刘能': '乡村爱情', '王宝强': '士兵突击'} id(dic2)= 1781472941112
2-1---:dic1= {'刘能': '刘老根Ⅱ', '王宝强': '士兵突击'} id(dic1)= 1781472941112
2-2---:dic2= {'刘能': '刘老根Ⅱ', '王宝强': '士兵突击'} id(dic2)= 1781472941112
***dict() 构造函数: ************************************************************
3-1---:dic1= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 18}} id(dic1)= 1781472940248
3-2---:dic2= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 18}} id(dic2)= 1781472941400
4-1---:dic1= {'刘能': '刘老根Ⅱ', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 19}} id(dic1)= 1781472940248
4-2---:dic2= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 19}} id(dic2)= 1781472941400
***dict.copy() 构造函数: ************************************************************
5-1---:dic1= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 18}} id(dic1)= 1781472902312
5-2---:dic2= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 18}} id(dic2)= 1781472940248
6-1---:dic1= {'刘能': '刘老根Ⅱ', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 19}} id(dic1)= 1781472902312
6-2---:dic2= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 19}} id(dic2)= 1781472940248
***使用深度拷贝: ************************************************************
7-1---:dic1= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 18}} id(dic1)= 1781442952720
7-2---:dic2= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 18}} id(dic2)= 1781472940464
7-1---:dic1= {'刘能': '刘老根Ⅱ', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 18}} id(dic1)= 1781442952720
7-2---:dic2= {'刘能': '乡村爱情', '王宝强': '士兵突击', 'ceo': {'name': 'ixusy88', 'age': 19}} id(dic2)= 1781472940464
"""
2.5 字典的其他常用操作
2.5.1:判断某个key是否存在
dic = {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记', '刘德华': '无间道', '王宝强': '士兵突击'}
# 1:使用get方法
if dic.get('黄日华1') == None:
print('黄日华1 不存在')
else:
print('黄日华1 存在')
# 2:成员关系 in
if '黄日华2' in dic:
print('黄日华2 存在')
else:
print('黄日华2 不存在')
if '黄日华3' in dic.keys():
print('黄日华3 存在')
else:
print('黄日华3 不存在')
2.5.1:字典的遍历
dic = {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记'}
# 对字典的遍历
print('-1-keys:' + '-'*30)
print(dic.keys()) # dict_keys(['黄日华', '苏有朋']) 像列表,但不是列表
# 遍历key,并通过key访问value
for key in dic.keys():
print(key, dic[key])
print('-2-values:' + '-'*30)
print(dic.values())
# 遍历value
for value in dic.values():
print(value)
print('-3-items:' + '-'*30)
# 也可以遍历字典
print(dic.items()) # 拿到的是 (key,value)元组
for item in dic.items():
print(item,type(item)) # item 为元组
print(item[0], item[1]) # 通过下标访问元组 item[0] 为key值,item[1]为value值
for item in dic.items():
k, v = item # item 是元组,进行解包
print(k, v)
# 可以直接使用下面的方式:
for key, value in dic.items(): # 当需要遍历字典,在操作中涉及到key和value的时候
print(key, value)
# 字典本身是一个可迭代对象,可以直接进行for循环
dic = {'黄日华': '天龙八部', '苏有朋': '倚天屠龙记'}
# 只需要遍历key的时候,使用这种方式
for key in dic: # 拿到的是Key, dic.keys()的结果一样
print(key)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)