Python3中的字典操作

1:字典的定义及特性

字典是一种无序集合的可变数据类型,它以{} 来表示,使用逗号来隔开,内部元素使用键值对(key:value)来存储对象,key必须是不可变的数据类型,value可以是任何类型的数据类型。
字典具有如下特性:
A:任意对象的无序集合,它可变长度,能够任意嵌套。
B:可通过键来访问。
C:属于“可变映射”类型。
D:字典是对象引用表(与列表一样,字典存储的也是对象引用)

2:常用字典字面量及操作

2.1常用字典字面量及操作汇总

image.png

image.png

image.png

image.png

查看更多方法及使用说明 使用下面语句查看:

#print(dir(dict))
print([item for item in dir(dict) if not item.startswith('__') ])
#print(help(dict))

2.2字典的增删改查

字典也是可变数据类型,因此可以进行增删改操作:

2.2.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.2.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.2.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.2.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.3 字典的拷贝

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.4 字典的其他常用操作

2.4.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.4.2:字典的遍历

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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。