day08-字典
字典(Dict)是一种可变、无序的数据类型;那等等...我们回忆一下,字符串列表元祖是什么样的?
- 字符串不可变,有序
- 列表可变,有序
- 元祖不可变,有序
如何判断有序和无序呢,我首先确定在字符串、列表、元祖篇我们都讲到了切片取值,说明他们都是有顺序的,而字典是无序的,说明字典无法通过切片取值,那字典是怎么取值的呢?
1、初识字典
这就需要我们说到字典的存储形式,是以键值对的形式存储的,键值对,键值对,键值对,重要的事情我们说三遍,要学习字典,我们必须要知道键值对key-value
键:是唯一的,所以是不变的数据类型作为键,那列表就不可以作为键,而字符串和数字,元祖都可以作为键
值:可以是任意类型的对象
键值对用冒号
" : "
分割,每个键值对之间用逗号 " , "
分割,整个字典包括在花括号 { }
中。# 字典例子 dict = {"name": "Hua", "age": 18, "city": "beijing"}
2、创建字典
使用{ }
创建
dict = {"name": "Hua", "age": 18, "city": "beijing"} print(dict) # 输出结果 {'name': 'Hua', 'age': 18, 'city': 'beijing'}
上述是使用了花括号创建的字典
使用dict()
函数
dict()
是一个内置函数,用于创建字典对象,并且dict( )方法有多种用法:1、通过关键字参数创建字典
dict(**kwargs)
:使用关键字参数列表中的 name=value
创建字典,name表示字典的键,value表示字典的值。例如dict(A="A")
,使用此方式创建字典时,name是不能带引号。dict = dict(name="Hua", age=18, city="beijing") print(dict) # 输出结果 {'name': 'Hua', 'age': 18, 'city': 'beijing'}
2、创建空字典
dict = dict() print(dict) # 输出结果 {}
3、通过另外的字典对象创建字典
my_dict = dict(name="Hua", age=18, city="beijing") my_dict2 = dict(my_dict) print(my_dict2) print(id(my_dict)) print(id(my_dict2)) # 输出结果 {'name': 'Hua', 'age': 18, 'city': 'beijing'} 2375348520640 2375350676928
我们可以看到可以通过现有的字典来创建一个新的字典,而且地址也不一样
这种新的字典对象和旧的字典对象并不指向同一个对象引用,也可以叫做浅拷贝
4、 通过iterable 创建字典
这个是什么意思呢,意思是dict函数里可以传入元祖或者列表,且传入的元祖或列表里必须再有一个元祖或列表,并且最里边的元祖或列表必须包含两个元素
我们直接看例子
首先先传入一个元祖,然后里边传入元祖和列表两种情况,且包含两个元素
demo = (('a', 1),) demo = (['a',1],) # 看一下结果 a = dict(demo) print(a, type(a)) # 输出结果 {'a': 1} <class 'dict'> {'a': 1} <class 'dict'>
还有先传入一个列表
demo = [('a', 1)] demo= [['a', 1]] # 看一下结果 a = dict(demo) print(a, type(a)) # 输出结果 {'a': 1} <class 'dict'> {'a': 1} <class 'dict'>
3、访问字典
在字典中内容是无序存在的,所以通过切片是取不到值,那使用什么方法取字典的值呢
dict = {"name": "Hua", "age": 18, "city": "beijing"}
有两种方式:
1、通过方括号[ key ]取字典的值
print(dict['name']) print(dict['age']) print(dict['city'])
2、通过 get(key) 方法
print(dict.get('name')) print(dict.get('age')) print(dict.get('city'))
那这两种取值方式有什么不一样呢?
在于取值如果当key不存在的时候,通过方括号[]取值会报错,而通过get方法的不会报错
print(dict['sex']) # 执行结果 KeyError: 'sex' # 报错 print(dict.get('sex')) # 执行结果 None # 取不到值返回None
4、字典增删改查
增
添加新的键值对很简单,直接给不存在的 key 赋值即可
my_dict = {} # 添加键值对 my_dict["name"] = "hua" my_dict["age"] = 18 # 批量添加键值对 update() 方法 my_dict.update({"name": "hua", "age": 18})
删
通过del
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} # 删除指定键的键值对 del my_dict["age"] print(my_dict) # {'name': 'Hua', 'city': 'beijing'}
通过pop
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} # 使用 pop() 方法删除指定键的键值对,并返回被删除的值 print(my_dict.pop("city")) # beijing print(my_dict) # {'name': 'Hua', 'age': 18}
通过clear
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} # 通过clear清空字典 print(my_dict.clear()) # {}
改
字典中键(key)是唯一的所以不能修改,我们只能修改值(value),而修改值我们也只需要在原有的value值重新通过key赋值,就达到修改的目的了
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} # 修改键值对 my_dict['age'] = 20 print(my_dict) # 输出结果 {'name': 'Hua', 'age': 20, 'city': 'beijing'}
查
查询就是我们上边讲的通过
方括号[ key ]
或者 get(key)方法
可以查到对应的值那我们还可以查什么呢?
我们可以通过
in
方法判断字典中是否有对应的键,如果有返回true,否则返回Falsemy_dict = {"name": "Hua", "age": 18, "city": "beijing"} # 判断my_dict字典中是否包含age的键 print('age' in my_dict) # True # 判断my_dict字典中是否包含sex的键 print('sex' in my_dict) # False
5、字典的常见方法
dict.keys()
返回字典中的所有键(key)
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} print(my_dict.keys()) # 输出结果 dict_keys(['name', 'age', 'city'])
dict.values()
返回字典中所有键对应的值(value)
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} print(my_dict.values()) # 输出结果 dict_values(['Hua', 18, 'beijing'])
dict.items()
返回字典中所有的键值对
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} print(my_dict.items()) # 输出结果 dict_items([('name', 'Hua'), ('age', 18), ('city', 'beijing')])
len(dict)
返回字典中键值对的数量
print(len(my_dict))
dict.copy()
可以创建字典的浅拷贝副本
# 字典的copy方法 my_dict = {"name": "Hua", "age": 18, "city": "beijing"} new_dict = my_dict.copy() print(new_dict) print(id(my_dict)) print(id(new_dict)) # 输出结果 {'name': 'Hua', 'age': 18, 'city': 'beijing'} 2912093184256 2912093184448
可以看出通过copy创建的字典对象和之前的不是同一个对象
我们修改初始字典的值
my_dict = {"name": "Hua", "age": 18, "city": "beijing"} new_dict = my_dict.copy() # 修改原始字典的值 my_dict["age"] = 26 print(my_dict) print(new_dict) # 输出结果 {'name': 'Hua', 'age': 26, 'city': 'beijing'} {'name': 'Hua', 'age': 18, 'city': 'beijing'}
可以看到,修改只在原始字典中生效,而拷贝字典保持不变
list(dict)
字典作为参数传递给
list()
函数时,它将返回一个包含字典所有键的列表my_dict = {"name": "Hua", "age": 18, "city": "beijing"} print(list(my_dict)) # 输出结果 ['name', 'age', 'city']
day08练习
初级
1.两种方式创建一个空字典
2.声明一个字典student,包含如下元素姓名、年龄、性别、身高
student = { "name": "张三", "age": 20, "gender": "男", "height": 1.75, }
3.计算2题中字典的长度并且打印输出
4.获取字典student中年龄的值
5.修改字典student中身高为1.80
中级
声明一个用户列表信息,每个字典代表1个用户,信息如下:
members = [ {"name": "张三", "age": 20, "gender": "男"}, {"name": "李四", "age": 24, "gender": "女"}, {"name": "王五", "age": 22, "gender": "男"} ]
1.该用户信息中有多少个用户
2.获取用户李四的年龄,打印输出
3.用户张三的信息增加一条信息为country为China,打印输出张三的信息
4.用户王五的信息删除年龄信息
5.获取用户信息,讲用户信息分类到一个列表中,比如name=['张三','李四','王五']
6.查看用户信息李四中是否有国家的信息
7.获取用户信息中年龄最大的用户名字,年龄最小的用户名字
高级
1.字典删除指定元素的两种方式,两者有什么不同
2.字典和JSON数据有什么区别