Python 中的字典可与字符串、列表、元组不同,因为字典 dict 需要由两部分组成,分别是 key 和 value ,简称:键值对,下面具体讲解一下关于字典的特点:
1、由一个或者多个键值对构成,键值对的类型可以不相同也可以相同;
2、字典中的键值对需要写在 {} 中括号内部,键值对中的 key 和 value 用 : 冒号隔开,键值对与键值对之间用 ,逗号隔开;
3、字典是一个无序的集合;
4、字典中 key 具有唯一性;

字典的格式:
{key:value,key:value,key:value,....}
{姓名:老王,地址:隔壁,性别:男,爱好:打球}
键 : 值
1 字典的操作都是根据 key,字典的key是不能重复的,是唯一的
2 字典里面的元素是无序的
3 在字典添加元素时,如果key存在就覆盖value值,如果不存在就添加新的键值对
4 字典的key的类型是不可变类型
可变类型 : 列表,字典
不可变类型 : 字符串,元组,数字类型
代码示例:
# 定义一个空字典
dict1 = dict()
print(dict1)
# 输出结果:{}
# 输出字典类型 dict
print(type(dict1))
# 输出结果:<class 'dict'>
# 获取字典键值对数量
print(len(dict1))
# 输出结果:0
#字典可以有一个或者多个键值对构成,键值对与键值对之间使用逗号隔开
dict2 = {"name":"隔壁老王", "age":42, "singe_dog":True}
print(dict2)
# 输出结果:{'name': '隔壁老王', 'age': 42, 'singe_dog': True}
# 输出字典类型 dict
print(type(dict2))
# 输出结果:<class 'dict'>
# 获取字典键值对数量
print(len(dict2))
# 输出结果:3
# 字典中出现了两个一样的key:"age",默认后面的value会覆盖前面的value
dict3 = {"name":"隔壁老王", "age":42, "singe_dog":True,"age":15}
print(dict3)
# 输出结果:{'name': '隔壁老王', 'age': 15, 'singe_dog': True}
注意:如果字典中出现相同的 key 值,只有最后一个 key / value 有效,前面相同的 key / value 会被覆盖,这就是字典 dict 所谓的唯一性。
添加数据
代码示例:
# 定义一个字典
dict1 = {"姓名":"美女","地址":"宇宙","性别":"女","爱好":"打扮"}
print(dict1)
# 输出结果:{'姓名': '美女', '地址': '宇宙', '性别': '女', '爱好': '打扮'}
print("dict1的类型是:",type(dict1))
# 输出结果:dict1的类型是: <class 'dict'>
# 添加没有的 key 元素,则直接添加
dict1["伴侣"] = "超人"
print("添加没有的key",dict1)
# 输出结果:添加没有的key {'姓名': '美女', '地址': '宇宙', '性别': '女', '爱好': '打扮', '伴侣': '超人'}
# 添加已经有的 key 元素,则直接覆盖
dict1["地址"] = "地球"
print("添加已经有的key",dict1)
# 输出结果:添加已经有的key {'姓名': '美女', '地址': '地球', '性别': '女', '爱好': '打扮', '伴侣': '超人'}
# 获取字典键值对数量
print(len(dict1))
# 输出结果:4
修改数据
1、字典是无序的,每个键值对没有索引值,这也是字典与字符串、列表、元组的区别;
2、修改字典中的键值对数据,直接根据键值对中的 key 值操作即可;
代码示例:
# 定义一个字典
dict1 = {"name":"zhangsan","age":38,"sing_dog":True}
print(dict1)
# 输出结果:{'name': 'zhangsan', 'age': 38, 'sing_dog': True}
# 修改key等于"name"对应的value,直接覆盖原有的值
dict1["name"] = "隔壁老王"
print(dict1)
# 输出结果:{'name': '隔壁老王', 'age': 38, 'sing_dog': True}
# 修改key等于"age"对应的value,直接覆盖原有的值
dict1["age"] = 18
print(dict1)
# 输出结果:{'name': '隔壁老王', 'age': 18, 'sing_dog': True}
# 修改key等于"sing_dog"对应的value,直接覆盖原有的值
dict1["sing_dog"] = False
print(dict1)
# 输出结果:{'name': '隔壁老王', 'age': 18, 'sing_dog': False}
删除数据
删除字典中的数据,需要根据键值对中的 key 值来删除对应的键值对,删除使用 del 关键字;
代码示例:
# 定义一个字典
dict1 = {"name":"zhangsan","age":38,"sing_dog":True}
print(dict1) # 输出删除之前的字典
# 输出结果:{'name': 'zhangsan', 'age': 38, 'sing_dog': True}
# 删除key等于"name"对应的键值对
del dict1["name"]
print(dict1)
# 输出结果:{'age': 38, 'sing_dog': True}
# 删除key等于"age"对应的键值对
del dict1["age"]
print(dict1)
# 输出结果:{'sing_dog': True}
# 删除key等于"sing_dog"对应的键值对
del dict1["sing_dog"]
print(dict1)
# 输出结果:{}
查询数据
查询字典中的键值对数据,操作和删除数据、修改数据一样,直接根据键值对中的 key 值操作即可;
代码示例:
# 定义一个字典
dict1 = {"name":"zhangsan","age":38,"sing_dog":True}
print(dict1) # 输出字典
# 输出结果:{'name': 'zhangsan', 'age': 38, 'sing_dog': True}
# 查询key等于"name"对应的value,通过key值查询,直接输出对应的value值
print(dict1["name"])
# 输出结果:zhangsan
# 查询key等于"name"对应的value,通过key值查询,直接输出对应的value值
print("查询姓名:",dict1.get("name"))
# 输出结果:查询姓名: zhangsan
字典的常用方法:
1、len 函数:获取字典长度,统计元素个数
2、update 函数:将一个字典添加到另外一个字典的末尾,把两个字典合并到一个字典,因为字典的key是唯一的,所以当字典合并起来的时候,key如果不存在就添加key,value,存在就修改value值。
3、clear 函数:清空字典
4、setdefault 函数:如果不存在就添加
代码示例:
# 定义一个字典
dict1 = {"name":"zhangsan","age":38}
print(dict1) # 输出字典
# 输出结果:{'name': 'zhangsan', 'age': 38}
# 定义一个字典
dict2 = {"sing_dog":True}
print(dict2)
# 输出结果:{'sing_dog': True}
# 统计字典中的元素个数
print("统计字典中的元素个数:",len(dict1))
# 输出结果:统计字典中的元素个数:2
# update()函数:将一个字典添加到另外一个字典的末尾
dict1.update(dict2)
# 将dict2合并到dict1,如果dict2中的key在dict1中没有,就添加键值对,如果dict2中的key在dict1有,覆盖value值
print(dict1) # 输出字典
# 输出结果:{'name': 'zhangsan', 'age': 38, 'sing_dog': True}
# setdefault 在字典中插入一个值,如果这个key不存在就添加,如果key存在就返回key对应的value值
dict1.setdefault("age","18") # 插入字典中有的key,则不变
dict1.setdefault("location") # 插入字典中没有的key,则直接添加,value为none
print("setdefault",dict1)
# 输出结果:setdefault {'name': 'zhangsan', 'age': 38, 'sing_dog': True, 'location': None}
字典的遍历
获取所有的值
代码示例:
# 定义字典
dict1 = {"name":"zhangsan","age":38}
# 获取所有的key
print(dict1)
# 输出结果:{'name': 'zhangsan', 'age': 38}
# 输出dict1的keys值
print(dict1.keys())
# 输出结果:dict_keys(['name', 'age'])
# 通过 key 拿 value
for i in dict1.keys():
print("key={}".format(i),"value={}".format(dict1.get(i)))
# 先拿到所有的key 然后根据key拿到value
# 输出结果:
# key=name value=zhangsan
# key=age value=38
获取所有的value值
代码示例:
# 定义两个字典
dict1 = {"name":"zhangsan","age":38}
dict2 = {"sing_dog":True}
# 获取所有的value值
print(dict1.values())
for i in dict1.values():
print(i)
# 输出结果:
# dict_values(['zhangsan', 38])
# zhangsan
# 38
获取所有的键和值
代码示例:
# 定义字典
dict1 = {"name":"zhangsan","age":38}
# 取出所有的key和value
print(dict1.items())
for i,j in dict1.items():
print(i,j)
# 输出结果:
# dict_items([('name', 'zhangsan'), ('age', 38)])
# name zhangsan
# age 38
字典拷贝
代码示例:
# 定义两个字典
dict1 = {"name":"zhangsan","age":38}
dict2 = {"sing_dog":True}
# 拷贝
dict2 = dict1.copy()
print(dict1)
# 输出结果:{'name': 'zhangsan', 'age': 38}
print(dict2)
# 输出结果:{'name': 'zhangsan', 'age': 38}
返回最后一个键值对
代码示例:
# 定义字典
dict1 = {"name":"zhangsan","age":38}
# 返回最后一个键值对
print(dict1.popitem())
print(dict1)
# 输出结果:('age', 38)
根据 key 来创建字典
代码示例:
# 定义字典
dict1 = {"name":"zhangsan","age":38}
# 根据key来创建字典
print(dict1.fromkeys("key"))
# 输出结果:{'k': None, 'e': None, 'y': None}
print(dict1)
# 输出结果:{'name': 'zhangsan', 'age': 38}
根据key来删除数据
代码示例:
# 定义字典
dict1 = {"name":"zhangsan","age":38}
# 根据key值删除元素
dict1.pop("name")
print(dict1)
# 输出结果:{'age': 38}
# 删除最后一个元素
dict1.popitem()
print(dict1)
# 输出结果:{'name': 'zhangsan'}
清空字典
代码示例:
# 定义字典
dict1 = {"name":"zhangsan","age":38}
# 清除整个字典
dict1.clear()
print(dict1)
# 输出结果:{}
字典推导式
语法规则:
语法一:
key:字典中的key
value:字典中的value
dict.items():序列
condition:条件表达式
key_exp:在for循环中,如果条件表达式condition成立(即条件表达式成立),返回对应的key,value并作key_exp,value_exp处理
value_exp:在for循环中,如果条件表达式condition成立(即条件表达式成立),返回对应的key,value并作key_exp,value_exp处理
格式1:{key_exp:value_exp for key,value in dict.items() if condition}
语法二:
key:字典中的key
value:字典中的value
dict.items():序列
condition:条件表达式
key_exp:在for循环中,如果条件表达式condition成立(即条件表达式成立),返回对应的key,value并作key_exp,value_exp处理
value_exp1:在for循环中,如果条件表达式condition成立(即条件表达式成立),返回对应的key,value并作key_exp,value_exp1处理
value_exp2:在for循环中,如果条件表达式condition不成立(即条件表达式不成立),返回对应的key,value并作key_exp,value_exp2处理
格式2:{key_exp:value_exp1 if condition else value_exp2 for key,value in dict.items()}
代码示例:
# 1.在字典中提取或者修改数据,返回新的字典
# 案例一:获取字典中key值是小写字母的键值对
dict2 = {}
dict1 = {"a":10,"B":20,"C":True,"D":"hello world","e":"python教程"}
# 传统写法
for key,value in dict1.items():
# 如果是key是小写
if key.islower():
dict2[key] = value
print(dict2)
# 输出结果:{'a': 10, 'e': 'python教程'}
# 字典推导式写法
dict3 = {key:value for key,value in dict1.items() if key.islower()}
print(dict3)
# 输出结果:{'a': 10, 'e': 'python教程'}
# 案例二:将字典中的所有key设置为小写
dict3 = {key.lower():value for key,value in dict1.items() }
print(dict3)
# 输出结果:{'a': 10, 'b': 20, 'c': True, 'd': 'hello world', 'e': 'python教程'}
# 案例三:将字典中所有key是小写字母的value统一赋值为'error'
dict4 = {key:value if key.isupper() else "error" for key,value in dict1.items() }
print(dict4)
# 输出结果:{'a': 'error', 'B': 20, 'C': True, 'D': 'hello world', 'e': 'error'}
案例:把字典转化成字符串
代码示例:
# 定义字典
dict2 = {'name': '老王', 'age': 18, 'addr': '长沙'}
str1 = str(dict2)
print("str1的类型是{},{}".format(type(str1),str1))
# 输出结果:str1的类型是<class 'str'>,{'name': '老王', 'age': 18, 'addr': '长沙'}
将字典的 value 和 key 分别整理成单独的列表
代码示例:
# 定义字典
dict3 = {"name":"老王","age":18,"addr":"长沙" }
# 取出字典的 key 值
print(dict3.keys())
# 取出字典的 value 值
print(dict3.values())
"""
输出结果:
dict_keys(['name', 'age', 'addr'])
dict_values(['老王', 18, '长沙'])
"""
